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.]
[Даю очевидные ответы на риторические вопросы]
Re[8]: MSVC2005 error C2764
От: gear nuke  
Дата: 26.05.06 18:31
Оценка: 1 (1)
Здравствуйте, MuTPu4, Вы писали:

MTP>

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>.

Вот такое компилируется:
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;
};

template<class T>
struct T_TRAITS<const T> {

  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;
}

EDG frontend ругается, как и ожидалось:
"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
Re[7]: MSVC2005 error C2764
От: Lorenzo_LAMAS  
Дата: 27.05.06 06:49
Оценка:
V>согласен, а ты никогда таки минусы и не ставил?

Ставил Но, как мне казалось и кажется, все же больше по делу
Of course, the code must be complete enough to compile and link.
Re[8]: MSVC2005 error C2764
От: Vain Россия google.ru
Дата: 28.05.06 14:02
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Ставил Но, как мне казалось и кажется, все же больше по делу

Ну вот, так я и говорю, что там написано согласен/не согласен, а ты расцениваешь их как прав/не прав..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.