Явно специализированным членам необходимо, чтобы их содержащие шаблоны классов были также явно специализированными

Я читал во многих статьях, что для шаблона класса при специализации
шаблон члена, класс, содержащий шаблон специализированного члена, также должен быть явно специализированным. Есть ли в этом смысл в стандарте и есть ли причина для такого ограничения?
Я имею в виду под капотом.

Почему это не разрешено?

template <typename T>
class A
{
template <typename U>
void foo()
{}
};

template <typename T>
template <>
void A<T>::foo<int>()
{}

3

Решение

[Temp.expl.spec] / 16:

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

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

конец примера ]

1

Другие решения


По вопросам рекламы [email protected]