12

可能重复:
模板类中模板化成员函数的特化

template <class T>    
class MyClass
{
   template <int N>
   void func() {printf("unspecialized\n");}
};
template<class T>
template<>
MyClass<T>::func<0>()
{
   printf("specialzied\n");
}

这不起作用。是否可以专门化模板类的模板方法?

4

1 回答 1

23

不能按要求完成。出于某种原因(我不确定基本原理)成员模板的显式(即完全)特化仅在封闭类也显式(即完全)特化时才允许。语言标准中明确规定了这一要求(参见 C++98 中的 14.7.3/18、C++11 中的 C++03 和 14.7.3/16)。

同时,允许成员类模板的部分特化,这在许多情况下可以用作一种变通方法(尽管是一种丑陋的变通方法)。但是,很明显,它只适用于成员模板。对于成员函数模板,必须使用替代解决方案。

例如,一种可能的解决方法是将调用委托给模板类的静态成员并专门化该类(这通常被推荐为比函数模板专门化更好的主意http://www.gotw.ca/publications/磨机17.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(); }
};
于 2012-04-16T17:29:43.713 回答