我在很多文章中读到,对于类模板,当特化成员模板时,包含特化成员模板的类也应显式特化。标准中有没有关于它的观点,是否有任何理由有这样的限制?我的意思是在引擎盖下。
为什么这是不允许的。
template <typename T>
class A
{
template <typename U>
void foo()
{}
};
template <typename T>
template <>
void A<T>::foo<int>()
{}
我在很多文章中读到,对于类模板,当特化成员模板时,包含特化成员模板的类也应显式特化。标准中有没有关于它的观点,是否有任何理由有这样的限制?我的意思是在引擎盖下。
为什么这是不允许的。
template <typename T>
class A
{
template <typename U>
void foo()
{}
};
template <typename T>
template <>
void A<T>::foo<int>()
{}
[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
—结束示例]