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

时间:2014-08-02 19:45:25

标签: c++ templates types

我有

等代码
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
}

为什么第二个错了?如何改变它以使其正确? 感谢!!!!

2 个答案:

答案 0 :(得分:2)

不可能只对一个单一成员函数进行部分专门化,你必须部分专门化整个类。这就是C++中的工作方式。

原因是您不能拥有部分专门的功能,而成员功能本身就是功能。通过对整个类进行部分特化,成员函数将“看起来”像具有较少类型的模板(在该部分专用类中)。

为什么你不能拥有部分专业功能是另一个故事,我没有一个好的答案/理解为什么这样做。

关于使它工作,你为什么不部分专门化这个类,然后只重新定义你需要的功能。

答案 1 :(得分:0)

一种方法是将单个函数移动到辅助类模板,该模板可以是部分专用的:

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本身一样。