在模板结构中重载函数

时间:2019-05-05 20:47:57

标签: c++ templates overloading

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

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秒在此数组中具有[3,7,1],则函数move将返回1因为数组[4,5,6]的第一个元素是4,您可以通过将数组[3,7,1]的3和1相加来获得它。我做了那个功能,它起作用了。

这是我的问题:我必须为Type = char重载此函数,因为不同的编译器将其视为未签名或已签名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){ ... }
}

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

1 个答案:

答案 0 :(得分:1)

您要执行的操作不是重载成员函数(为 same vekt专业化提供不同参数类型的多种实现),而是(明确地) 对其进行专门化,对于Typechar的情况,可以将其视为覆盖的一般定义。语法只是

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

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