对于我的作业,我们必须制作一个具有各种变量和功能的模板化结构。这是它的简化版本:

template <class Type>
struct vekt{
    Type *array;
    int len_of_array;
    int move(vekt<Type>* second, Type start){ ... }
}


函数移动的工作方式:它检查是否可以将调用的vekt的数组的第一个元素(array [0])移动到第二个vekt,如果可以,则这样做。如果您可以从第二个->数组中获取该元素作为各种元素的总和,则可以移动调用vekt的第一个元素。类型开始是添加该类型的中性元素。

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

这是我的问题:我必须为Type = char重载此函数,因为不同的编译器将其视为unsigned或signed char。我知道我该怎么做,但我不知道该怎么做。我不知道如何将重载写入结构。我可以这样做,然后只在第一个函数移动中编写特定于char的代码吗? :

template <class Type>
struct vekt{
    Type *array;
    int len_of_array;
    int move(vekt<char>* second, char start){ ... }
    int move(vekt<Type>* second, Type start){ ... }
}


如果没有,那我该怎么办?我的英语不是最好,但我希望我的解释是可以理解的

最佳答案

您要执行的操作不是重载成员函数(为同一vekt专业化提供不同实参类型的多个实现),而是(明确地)对其进行专业化,这可以看作是在Type情况下覆盖其一般定义。是char。语法只是

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


(请注意,可以在随后的vekt提及以及类模板中的所有提及中省略模板参数列表。)

关于c++ - 在模板结构中重载函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55996278/

10-09 00:24