Специализация класса-члена, вложенного в неспециализированный класс - PullRequest
0 голосов
/ 03 февраля 2011
template <typename T>
struct A
   {
   template <typename U>
   struct B;

   template <>
   struct B<int> {static const int tag = 1;};  // Works fine in VS2010
   };

Как я могу специализироваться B так же, но за пределами A. Я попытался безуспешно:

template <typename T> template <>
struct A<T>::B<int> {static const int tag = 1;};

Я получил:

error C3212: 'A<T>::B<int>' : an explicit specialization of a template member must be a member of an explicit specialization

Это не имеет смысла, так как я могу сделать это точно, определив его внутри проблемы класса

VS2010?Неправильный синтаксис?

Спасибо


PS: Этот (который все равно должен быть неправильным, вылетает VS2010):

template <> template <typename T>
struct A<T>::B<int> {static const int tag = 1;};

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Чтобы процитировать спецификацию C ++, §14.17.3.18:

В явном объявлении специализации для элемента шаблона класса или шаблона элемента, который появляется в области пространства имен, шаблоне элемента и некоторых другихиз его шаблонов вложенных классов могут остаться не специализированными, за исключением того, что объявление не должно явно специализировать шаблон члена класса, если его шаблоны вложенных классов также не являются явно специализированными .[...]

(мой акцент)

Это говорит о том, что вы не можете специализировать шаблонный класс, вложенный в другой шаблонный класс, если только внешний шаблонный класс не специализирован.Похоже, что в VS2010 такое поведение неправильное, а в g ++ - правильное.

1 голос
/ 03 февраля 2011

Так просто не работает. :-(

Вы не можете специализировать функцию внутри объявления класса, даже если msvc принимает это с настройками по умолчанию.

Вы также не можетеспециализировать функцию-член, не специализируя также и класс-оболочку. Большинство компиляторов используют это (как и языковой стандарт).

...