Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不能在c++;模板_C++_Templates_Types - Fatal编程技术网

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不是该成员的副本(此处:函数模板;此处:类模板的成员函数),谢谢。像这篇文章: