Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates_Overloading - Fatal编程技术网

C++ 在模板结构中重载函数

C++ 在模板结构中重载函数,c++,templates,overloading,C++,Templates,Overloading,在我的家庭作业中,我们必须制作一个包含各种变量和函数的模板结构。以下是它的缩写版本: 样板 结构vekt{ 类型*数组; _数组的int len_; int movevekt*second,键入start{…} } 函数move的工作原理:它检查是否可以将调用vekt的数组[0]的第一个元素移动到第二个vekt中,如果可以,它会这样做。如果可以将调用vekt的第一个元素作为第二个->数组中各种元素的总和,则可以移动该元素。类型start是用于添加该类型的中性元素 例如,对于Type=int,如果

在我的家庭作业中,我们必须制作一个包含各种变量和函数的模板结构。以下是它的缩写版本:

样板 结构vekt{ 类型*数组; _数组的int len_; int movevekt*second,键入start{…} } 函数move的工作原理:它检查是否可以将调用vekt的数组[0]的第一个元素移动到第二个vekt中,如果可以,它会这样做。如果可以将调用vekt的第一个元素作为第二个->数组中各种元素的总和,则可以移动该元素。类型start是用于添加该类型的中性元素

例如,对于Type=int,如果调用的vekt在数组[4,5,6]中有此项,并且vekt second有此项:[3,7,1],函数move将返回1,因为数组[4,5,6]的第一个元素是4,您可以通过从数组[3,7,1]中添加3和1来获得它。我做了这个函数,它工作了

这就是我的问题:我必须为Type=char重载此函数,因为不同的编译器将其视为无符号或有符号字符。我知道我必须做什么,但我不知道怎么做。我不知道如何将重载写入结构。我可以这样做,然后在第一个函数move中为char编写特定的代码吗

样板 结构vekt{ 类型*数组; _数组的int len_; int movevekt*秒,字符开始{…} int movevekt*second,键入start{…} }
如果没有,那我该怎么办?我的英语不是最好的,但我希望我的解释是可以理解的

您要做的不是重载成员函数,为同一vekt专门化的不同参数类型提供多个实现,而是显式专门化它,对于类型为char的情况,可以将其视为覆盖其常规定义。语法只是

template<> void vekt<char>::move(vekt *second,char start) {…}

请注意,后续提到的vekt以及类模板中的所有内容都可以忽略模板参数列表。

如果类型已经是char,该怎么办?您不能专门化函数,它没有模板化。您必须专门化结构,是的,这包括复制代码的其余部分或创建公共基类。为什么字符是否被签名很重要?可能是XY问题。@Quimby:不是真的:您专门化了类模板的非模板成员。@DavisHerring您确定吗?我没有在链接中看到它。如果没有类的话,专门化函数怎么行?@Quimby:我想弄清楚这是否是理想的答案,但我认为你是对的。