【问题标题】:Explicitly specialized members need their containing class templates to be explicitly specialized as well显式特化的成员也需要其包含的类模板也显式特化
【发布时间】:2015-01-12 19:18:55
【问题描述】:
我在很多文章中读到,专门用于类模板
成员模板,包含特化成员模板的类也应显式特化。标准中有没有关于它的观点,是否有任何理由有这样的限制?
我的意思是在引擎盖下。
为什么不允许这样做。
template <typename T>
class A
{
template <typename U>
void foo()
{}
};
template <typename T>
template <>
void A<T>::foo<int>()
{}
【问题讨论】:
标签:
c++
templates
member
explicit-specialization
【解决方案1】:
[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
— 结束示例 ]