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.С++ не посмел ответить, поэтому я снова помещаю его сюда с благодарностью.
Примечание. Мне нужна эта функция для рекурсивных шаблонов внутреннего класса для набора внешнего класса, а специализация внутреннего параметра зависит от параметра внешнего шаблона.