Я читал во многих статьях, что для шаблона класса при специализации
шаблон члена, класс, содержащий шаблон специализированного члена, также должен быть явно специализированным. Есть ли в этом смысл в стандарте и есть ли причина для такого ограничения?
Я имею в виду под капотом.
Почему это не разрешено?
template <typename T>
class A
{
template <typename U>
void foo()
{}
};
template <typename T>
template <>
void A<T>::foo<int>()
{}
В явном объявлении специализации для члена класса
шаблон или шаблон элемента, который появляется в области пространства имен,
шаблон члена и некоторые из его шаблонов классов могут остаться
неспециализированный, за исключением того, что декларация не должна явно
специализировать шаблон члена класса, если он включает в себя шаблоны классов
не являются явно специализированными. [ Пример:template <class T1> class A { template<class T2> class B { template<class T3> void mf1(T3); void mf2(); }; }; template <> template <class X> class A<int>::B { template <class T> void mf1(T); }; template <> template <> template<class T> void A<int>::B<double>::mf1(T t) { } template <class Y> template <> void A<Y>::B<double>::mf2() { } // ill-formed; B<double> is specialized // but its enclosing class template A is not
— конец примера ]