MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 02:30
Оценка:
Проект компилиться в msvc2003, а в 2005 выдаёт вот это.
Я так понимаю в 2005 МС ограничело явное снятие квалификаторов с типов?
Не подскажет ли олл, следует ли это стандарту?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: MSVC2005 error C2764
От: Aera Беларусь  
Дата: 26.05.06 05:57
Оценка: 1 (1) +1
Здравствуйте, Vain, Вы писали:

V>Проект компилиться в msvc2003, а в 2005 выдаёт вот это.

V>Я так понимаю в 2005 МС ограничело явное снятие квалификаторов с типов?
V>Не подскажет ли олл, следует ли это стандарту?

Я долго читал твое сообщение, но так и не понял что у тебя за проблема.

Чтобы найти ответ на твой вопрос могу порекомендовать внимательно почитать описание "error C2764" в MSDN, а затем также внимательно почитать стандарт.

Если же ты хочешь чтобы тебе отвечали в форуме, еще более внимательно читай это Как правильно задавать вопросы, много думай.
--
RedApe
Re[2]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 11:02
Оценка:
Здравствуйте, Aera, Вы писали:

V>>Проект компилиться в msvc2003, а в 2005 выдаёт вот это.

V>>Я так понимаю в 2005 МС ограничело явное снятие квалификаторов с типов?
V>>Не подскажет ли олл, следует ли это стандарту?
A>Если же ты хочешь чтобы тебе отвечали в форуме, еще более внимательно читай это Как правильно задавать вопросы, много думай.
А ты наверно из тех, кто лучше всех задаёт вопросы? :D

template<class T>
struct T_TRAITS {

  template<int N> struct _SWITCH;

  template<> struct _SWITCH<1> {
    template<class _T>
    struct TEST {
      typedef _T TYPE;
    };
    template<class _T>
    struct TEST<const _T> {
      typedef _T TYPE;
    };
  };

  typedef typename _SWITCH<1>::TEST<T>::TYPE TYPE;
};

typedef T_TRAITS<int>::TYPE TYPE;

int main() {
  return 0;
}
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: MSVC2005 error C2764
От: Ovl Россия  
Дата: 26.05.06 11:29
Оценка: -1
Здравствуйте, Vain, Вы писали:

    template<class _T>
// а что ты хотел сказать вот этим? const - квалификатор инстанса, а не типа
    struct TEST<const _T> {
      typedef _T TYPE;
    };
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[4]: MSVC2005 error C2764
От: Ovl Россия  
Дата: 26.05.06 11:34
Оценка:
кстати, msvc2003



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
        ]
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[3]: MSVC2005 error C2764
От: MuTPu4  
Дата: 26.05.06 12:18
Оценка: 1 (1) -1 :)
Здравствуйте, Vain, Вы писали:

Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (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.

Re[4]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 14:05
Оценка:
Здравствуйте, MuTPu4, Вы писали:

MTP>Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (14.7.3/2). Советую

просто похоже очередная бага...
template<class T>
struct T_TRAITS {

  template<class _T>
  struct TEST {
    typedef _T TYPE;
  };
  template<class _T>
  struct TEST<const _T> {
    typedef _T TYPE;
  };
  typedef typename TEST<T>::TYPE TYPE;
};

typedef T_TRAITS<int>::TYPE TYPE;

int main() {
  return 0;
}
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 14:09
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>
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.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: MSVC2005 error C2764
От: Ovl Россия  
Дата: 26.05.06 14:18
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, Ovl, Вы писали:


Ovl>>
Ovl>>    template<class _T>
Ovl>>// а что ты хотел сказать вот этим? const - квалификатор инстанса, а не типа
Ovl>>    struct TEST<const _T> {
Ovl>>      typedef _T TYPE;
Ovl>>    };
Ovl>>


V>А как по-твоему снимается квалификатор с типа?


в смысле — снимается?
можно пример использования?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[6]: MSVC2005 error C2764
От: Ovl Россия  
Дата: 26.05.06 14:18
Оценка:
Здравствуйте, 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>можно пример использования?

снимается — понял, что имеется ввиду.
а просьба о примере — осталась
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[5]: MSVC2005 error C2764
От: Lorenzo_LAMAS  
Дата: 26.05.06 14:19
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, MuTPu4, Вы писали:


MTP>>Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (14.7.3/2). Советую

V>просто похоже очередная бага...

Прежде чем раздавать минусА отвечающим тебе людям, стоит все же вчитаться в их ответы и посмотреть приведенные ссылки.
Of course, the code must be complete enough to compile and link.
Re[5]: MSVC2005 error C2764
От: MuTPu4  
Дата: 26.05.06 14:51
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, MuTPu4, Вы писали:


MTP>>Специализировать шаблон можно только в объемлющем пространстве имен, но не в классе (14.7.3/2). Советую

V>просто похоже очередная бага...
Извиняюсь, что не указал сразу. Речь шла о полной специализации шаблона, к частичной специализации применимы несколько другие правила и такой синитаксис явным образом не запрещен.
Re[6]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 16:41
Оценка:
Здравствуйте, 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.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 16:42
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>а просьба о примере — осталась

дык он уже написан
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 16:46
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Прежде чем раздавать минусА отвечающим тебе людям, стоит все же вчитаться в их ответы и посмотреть приведенные ссылки.

согласен, а ты никогда таки минусы и не ставил?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 17:00
Оценка:
Здравствуйте, Vain, Вы писали:

V>14.7.3/2

Там в начале написано:

An explicit specialization of any of the following:
...
— member class template of a class template
...
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: MSVC2005 error C2764
От: MuTPu4  
Дата: 26.05.06 17:25
Оценка:
Здравствуйте, 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, но явных запретов на такой синтаксис в стандарте нет.
Re[8]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 18:01
Оценка:
Здравствуйте, MuTPu4, Вы писали:

MTP>В первом примере полная специализация (explicit specialization) структуры _SWITCH внутри структуры T_TRAITS, в этом и была ошибка.

template<int N> struct _SWITCH;

template<> struct _SWITCH<1> {
  template<class _T>
  struct TEST {
    typedef _T TYPE;
  };
  template<class _T>
  struct TEST<const _T> {
    typedef _T TYPE;
  };
};

typedef _SWITCH<1>::TEST<const int>::TYPE TYPE;

компилится раз

template<class T>
struct T_TRAITS {

  template<int N> struct _SWITCH;

  template<> struct _SWITCH<1> {
    template<class _T>
    struct TEST {
      typedef _T TYPE;
    };
  };

  typedef typename _SWITCH<1>::TEST<T>::TYPE TYPE;
};

typedef T_TRAITS<int>::TYPE TYPE;

int main() {
  return 0;
}

компилится два
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[9]: MSVC2005 error C2764
От: MuTPu4  
Дата: 26.05.06 18:12
Оценка:
Здравствуйте, Vain, Вы писали:

V>компилится два

Второй пример мне удалось скомпилировать только с помощью VC 7.1 (очевидно, баг). Причину некорректности такого кода я уже неоднократно указал.
Re[10]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 26.05.06 18:29
Оценка:
Здравствуйте, MuTPu4, Вы писали:

V>>компилится два

MTP>Второй пример мне удалось скомпилировать только с помощью VC 7.1 (очевидно, баг). Причину некорректности такого кода я уже неоднократно указал.
2005 у меня это компилирует
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.