Проект компилиться в msvc2003, а в 2005 выдаёт вот это.
Я так понимаю в 2005 МС ограничело явное снятие квалификаторов с типов?
Не подскажет ли олл, следует ли это стандарту?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Проект компилиться в msvc2003, а в 2005 выдаёт вот это. V>Я так понимаю в 2005 МС ограничело явное снятие квалификаторов с типов? V>Не подскажет ли олл, следует ли это стандарту?
Я долго читал твое сообщение, но так и не понял что у тебя за проблема.
Чтобы найти ответ на твой вопрос могу порекомендовать внимательно почитать описание "error C2764" в MSDN, а затем также внимательно почитать стандарт.
Если же ты хочешь чтобы тебе отвечали в форуме, еще более внимательно читай это Как правильно задавать вопросы, много думай.
Здравствуйте, Aera, Вы писали:
V>>Проект компилиться в msvc2003, а в 2005 выдаёт вот это. V>>Я так понимаю в 2005 МС ограничело явное снятие квалификаторов с типов? V>>Не подскажет ли олл, следует ли это стандарту? A>Если же ты хочешь чтобы тебе отвечали в форуме, еще более внимательно читай это Как правильно задавать вопросы, много думай.
А ты наверно из тех, кто лучше всех задаёт вопросы? :D
Compiling...
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
cl /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Gm /EHsc /RTC1 /MLd /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /c /Wp64 /ZI /TP
.\1111111111.cpp
1111111111.cpp
e:\Temp\1111111111\1111111111.cpp(19) : error C2764: '_T' : template parameter not used in partial specialization 'T_TRAITS<T>::_SWITCH<1>::TEST<const N>'
e:\Temp\1111111111\1111111111.cpp(23) : see reference to class template instantiation 'T_TRAITS<T>' being compiled
e:\Temp\1111111111\1111111111.cpp(19) : error C2764: '_T' : template parameter not used in partial specialization 'T_TRAITS<T>::_SWITCH<1>::TEST<const T1>'
with
[
T=int
]
e:\Temp\1111111111\1111111111.cpp(25) : see reference to class template instantiation 'T_TRAITS<T>' being compiled
with
[
T=int
]
Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (14.7.3/2). Советую сразу отказаться от такой вложенности специализированных шаблонов, перенеся их на уровень пространства имен и пересмотреть стиль именования (используются зарезервированные идентификаторы).
PS
(14.7.3/7):
When writing a specialization,
be careful about its location;
or to make it compile
will be such a trial
as to kindle its self-immolation.
Здравствуйте, MuTPu4, Вы писали:
MTP>Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (14.7.3/2). Советую
просто похоже очередная бага...
Ovl> template<class _T>
Ovl>// а что ты хотел сказать вот этим? const - квалификатор инстанса, а не типа
Ovl> struct TEST<const _T> {
Ovl> typedef _T TYPE;
Ovl> };
Ovl>
А как по-твоему снимается квалификатор с типа?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, Ovl, Вы писали:
Ovl>>
Ovl>> template<class _T>
Ovl>>// а что ты хотел сказать вот этим? const - квалификатор инстанса, а не типа
Ovl>> struct TEST<const _T> {
Ovl>> typedef _T TYPE;
Ovl>> };
Ovl>>
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, Vain, Вы писали:
V>>Здравствуйте, Ovl, Вы писали:
Ovl>>>
Ovl>>> template<class _T>
Ovl>>>// а что ты хотел сказать вот этим? const - квалификатор инстанса, а не типа
Ovl>>> struct TEST<const _T> {
Ovl>>> typedef _T TYPE;
Ovl>>> };
Ovl>>>
V>>А как по-твоему снимается квалификатор с типа?
Ovl>в смысле — снимается? Ovl>можно пример использования?
снимается — понял, что имеется ввиду.
а просьба о примере — осталась
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, MuTPu4, Вы писали:
MTP>>Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (14.7.3/2). Советую V>просто похоже очередная бага...
Прежде чем раздавать минусА отвечающим тебе людям, стоит все же вчитаться в их ответы и посмотреть приведенные ссылки.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, MuTPu4, Вы писали:
MTP>>Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (14.7.3/2). Советую V>просто похоже очередная бага...
Извиняюсь, что не указал сразу. Речь шла о полной специализации шаблона, к частичной специализации применимы несколько другие правила и такой синитаксис явным образом не запрещен.
Здравствуйте, MuTPu4, Вы писали:
MTP>>>Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (14.7.3/2). Советую V>>просто похоже очередная бага... MTP>Извиняюсь, что не указал сразу. Речь шла о полной специализации шаблона, к частичной специализации применимы несколько другие правила и такой синитаксис явным образом не запрещен.
Может я чего-то непонял, но причём здесь полная специализация?
Посмотри два примера — в обоих частичная специализация, но один не компилиться, а второй — компилиться
14.7.3/2
...
An explicit specialization of a member function, member class or static data member of class template shall be declared in the namespace of which the class template is a member. Such a declaration may also be a defination.
...
т.е. и объявлять можно и определять там же можно
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Прежде чем раздавать минусА отвечающим тебе людям, стоит все же вчитаться в их ответы и посмотреть приведенные ссылки.
согласен, а ты никогда таки минусы и не ставил?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Может я чего-то непонял, но причём здесь полная специализация? V>Посмотри два примера — в обоих частичная специализация, но один не компилиться, а второй — компилиться
В первом примере полная специализация (explicit specialization) структуры _SWITCH внутри структуры T_TRAITS, в этом и была ошибка.
V>14.7.3/2
An explicit specialization shall be declared in the namespace of which the template is a member, or, for member templates, in the namespace of which the enclosing class or enclosing class template is a member.
V>т.е. и объявлять можно и определять там же можно
Нет, прочтите внимательнее. Для member templates (в данном случае member class template) специализация может быть деклорирована (в т.ч. определена) только в пространстве имен объемлющего класса. Однако, к частичной специализации это не относится (14.5.4), там есть несколько смущающий параграф 6, но явных запретов на такой синтаксис в стандарте нет.
Здравствуйте, MuTPu4, Вы писали:
MTP>В первом примере полная специализация (explicit specialization) структуры _SWITCH внутри структуры T_TRAITS, в этом и была ошибка.
Здравствуйте, Vain, Вы писали:
V>компилится два
Второй пример мне удалось скомпилировать только с помощью VC 7.1 (очевидно, баг). Причину некорректности такого кода я уже неоднократно указал.
Здравствуйте, MuTPu4, Вы писали:
V>>компилится два MTP>Второй пример мне удалось скомпилировать только с помощью VC 7.1 (очевидно, баг). Причину некорректности такого кода я уже неоднократно указал.
2005 у меня это компилирует
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
MTP>An explicit specialization shall be declared in the namespace of which the template is a member, or, for member templates, in the namespace of which the enclosing class or enclosing class template is a member.
Самое интересное, что MSVC 2005 это не смущает, а проблема у него из-за специализации struct TEST<const _T>.
"ComeauTest.c", line 6: error: explicit specialization is not allowed in the
current scope
template<> struct _SWITCH<1> {
^
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Ставил Но, как мне казалось и кажется, все же больше по делу
Ну вот, так я и говорю, что там написано согласен/не согласен, а ты расцениваешь их как прав/не прав..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]