我有
等代码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
}
为什么第二个错了?如何改变它以使其正确? 感谢!!!!
答案 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
本身一样。