Подтвердить что ты не робот

С++: ошибка вложенных шаблонов классов "явная специализация в области без пространства имен"

Следующий код:

template <class T1>
struct A1
{
  template <int INDEX>
  struct A2 { /* ... */ };

  template <>
  struct A2<-1> { /* ... */ };
};

int main() 
{
  A1<int>::A2<-1> x;
}

Дает эту ошибку:

prog.cpp: 7: 13: ошибка: явная специализация в области без пространства имен 'struct A1<T1>'   prog.cpp: 8: 10: ошибка: параметры шаблона, не используемые в частичной специализации:
   prog.cpp: 8: 10: ошибка: 'T1'

Как лучше обойти эту ошибку? Я пробовал это:

template <class T1>
struct A1
{
  template <int INDEX, class DUMMY = void>
  struct A2 { /* ... */ };

  template <class DUMMY>
  struct A2<-1, DUMMY> { /* ... */ };
};

int main() 
{
  A1<int>::A2<-1> x;
}

Кажется, что он работает, но также кажется немного выдумкой.

Есть ли лучший способ обойти это?

Я просмотрел предыдущие ответы и мог находить только те функции с функциями в классах, а не классы в классах. Я также нашел трюк "DUMMY" в других ответах, но задавался вопросом, есть ли более приятное решение.

Кроме того, в качестве побочного примечания, это первый код, разрешенный С++ 0x?

4b9b3361

Ответ 1

Нельзя явно специализировать A2 без специализации A1 (раздел 14.7.3/18). С++ 0x имеет такое же ограничение (n3242 & sect; 14.7.3/16). В то же время допускается частичная специализация вложенного класса. Итак, трюк с манекеном класс Ok.