专门化模板类的模板化成员

时间:2012-04-16 17:14:16

标签: c++ templates

  

可能重复:
  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");
}

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

1 个答案:

答案 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(); }
};