为什么在c++模板中不能部分特化成员函数

why cannot partially specialize a member function, in c++ template

本文关键字:成员 函数 不能部 c++ 为什么      更新时间:2023-10-16

我有这样的代码

template <class T> class Widget
{
    void fun() {}
}
//Okay: specialization of a member function of widget
template <> void Widget<char>:: fun() 
{
  void fun() {}
}

但是,下面是错误的,因为我被告知。但不明白为什么。

template<class T, class U> class Gadget
{
  void fun() {}
}
//Error! cannot partially specialize a member function of Gadget
template<class U> void Gadget<char,U>::fun()
{
  ..specialized implementation
}

为什么第二个是错的?如何改变它使它正确?谢谢! !

对单个成员函数进行部分特化是不可能的,必须对整个类进行部分特化。这就是C++的工作原理。

原因是不能有部分专门化的函数,而成员函数本身就是函数。通过部分专门化整个类,成员函数将"看起来"像具有更少类型的模板(在该部分专门化类中)。

为什么你不能有部分专门化的函数是另一回事,我没有一个很好的答案/理解为什么这是强制的。

要使它工作,为什么不部分特化类,然后只重新定义需要的函数

一种方法是将该函数移动到一个助手类模板中,该模板可以部分专门化:

template<class T, class U> class Gadget;
template<class T, class U>
struct Gadget_fun
{
    static void do_it(Gadget<T,U>* This) {}
};
template<class T, class U> class Gadget
{
    friend class Gadget_fun<T,U>;
    void fun() { Gadget_fun<T,U>::do_it(this); }
};
template<class U>
struct Gadget_fun<char, U>
{
    static void do_it(Gadget<char,U>* This)
    {
      //..specialized implementation
    }
};

这样,您就不必复制所有其他成员,因为您要专门化Gadget本身。