专用于模板类的模板化成员

Specializing a templated member of a template class

本文关键字:成员 专用 用于      更新时间:2023-10-16

可能的重复项:
模板化类中模板化成员函数的专用化

template <class T>    
class MyClass
{
   template <int N>
   void func() {printf("unspecializedn");}
};
template<class T>
template<>
MyClass<T>::func<0>()
{
   printf("specialziedn");
}

这行不通。是否可以专门化模板类的模板方法?

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

同时,允许成员模板的部分专用化,在许多情况下,这可以用作解决方法(尽管很丑陋)。 但是,显然,它仅适用于成员模板。当涉及到成员函数模板时,必须使用替代解决方案。

例如,一种可能的解决方法是将调用委托给模板类的静态成员,并改为专用化该类(通常建议这样做,因为它比函数模板专用化 http://www.gotw.ca/publications/mill17.htm 更好)

template <class T>    
class MyClass
{
   template <int N, typename DUMMY = void> struct Func {
     static void func() { printf("unspecializedn"); }
   };
   template <typename DUMMY> struct Func<0, DUMMY> {
     static void func() { printf("specializedn"); }
   };
   template <int N> void func() { Func<N>::func(); }
};