首页 > 解决方案 > 重载模板结构中的函数

问题描述

对于我的作业,我们必须制作一个包含各种变量和函数的模板结构。这是它的缩短版本:

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

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

例如,对于 Type=int,如果调用 vekt 在数组中有这个:[4,5,6],而 vekt 第二个有这个:[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){ ... }
}

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

标签: c++templatesoverloading

解决方案


您要做的不是重载成员函数(为相同 的特化提供不同参数类型的多个实现vekt),而是(明确地)对其进行化,这可以看作是覆盖其对 where Typeis的一般定义char。语法只是

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

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


推荐阅读