template<int x> struct A {
template<int y> struct B {};.
template<int y, int unused> struct C {};
};
template<int x> template<>
struct A<x>::B<x> {}; // error: enclosing class templates are not explicitly specialized
template<int x> template<int unused>
struct A<x>::C<x, unused> {}; // ok
Так почему явная специализация внутреннего, вложенного класса (или функции) не разрешена, если внешний класс тоже не специализирован? Как ни странно, я могу обойти это поведение, если только частично специализирую внутренний класс простым добавлением фиктивного параметра шаблона. Делает вещи ужаснее и сложнее, но это работает.
Я бы рассматривал полные специализации как подмножество частичных специализаций - особенно потому, что вы можете выразить каждую полную специализацию как частичную с добавлением фиктивного параметра. Так что это неоднозначность между частичной и полной специализацией не имеет для меня никакого смысла.
К сожалению, никто на comp.std.c ++ не осмелился ответить, поэтому я снова выкладываю его здесь с наградой.
Примечание: мне нужна эта функция для рекурсивных шаблонов внутреннего класса для набора внешнего класса, а специализация внутреннего параметра зависит от параметра внешнего шаблона.