Проект компилиться в 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.]
[Даю очевидные ответы на риторические вопросы]