可能重复:
Specialization of templated member function in templated class
template <class T>
class MyClass
{
template <int N>
void func() {printf("unspecialized\n");}
};
template<class T>
template<>
MyClass<T>::func<0>()
{
printf("specialzied\n");
}
这不起作用。是否可以专门化模板类的模板方法?
答案 0 :(得分:17)
无法按要求完成。出于某种原因(我不确定基本原理)显式(即完整)成员模板的专门化仅在封闭类也明确时才允许(即完全)专门。该要求在语言标准中明确规定(参见C ++ 98中的14.7.3 / 18,C ++ 11中的C ++ 03和14.7.3 / 16)。
同时,允许成员类模板的部分特化,这在许多情况下可以用作解决方法(尽管是丑陋的)。但是,显然,它仅适用于成员类模板。对于成员功能模板,必须使用替代解决方案。
例如,一种可能的解决方法是将调用委托给模板类的静态成员,并专门化该类(通常建议将其作为比功能模板http://www.gotw.ca/publications/mill17.htm的特化更好的想法)
template <class T>
class MyClass
{
template <int N, typename DUMMY = void> struct Func {
static void func() { printf("unspecialized\n"); }
};
template <typename DUMMY> struct Func<0, DUMMY> {
static void func() { printf("specialized\n"); }
};
template <int N> void func() { Func<N>::func(); }
};