C++ 为什么不能在c++;模板
我有这样的代码C++ 为什么不能在c++;模板,c++,templates,types,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() {} } 模板类小部件 { void fun(){} } //好的:widget成员函数的专门化 模板void小部件::
template <class T> class Widget
{
void fun() {}
}
//Okay: specialization of a member function of widget
template <> void Widget<char>:: fun()
{
void fun() {}
}
模板类小部件
{
void fun(){}
}
//好的:widget成员函数的专门化
模板void小部件::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
}
模板类小工具
{
void fun(){}
}
//错误!无法部分专门化Gadget的成员函数
模板void Gadget::fun()
{
…专门实施
}
为什么第二个错误?如何改变它使之正确?
谢谢 不可能只对单个成员函数进行部分专门化,必须对整个类进行部分专门化。这就是
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
}
};
模板类小工具;
模板
struct Gadget_fun
{
静态void do_it(Gadget*This){
};
模板类小工具
{
朋友级小玩意(fun);;
void fun(){Gadget_fun::do_it(this);}
};
模板
struct Gadget_fun
{
静态void do_it(Gadget*This)
{
//…专门实施
}
};
通过这种方式,您不必像专门化Gadget
本身那样复制所有其他成员。@nix不是该成员的副本(此处:函数模板;此处:类模板的成员函数),谢谢。像这篇文章: