c++ - 模板类成员函数

标签 c++ class templates operator-overloading member-functions

我有一个名为 Time 的类。只有两个私有(private)成员:int hoursint minutes。公共(public)访问说明符仅包含加法、减法等函数。

但是有一个特定的函数不按我想要的方式运行。它在类中声明为 public

这样编译:

Time Time::operator*(const int &mult)
{
   minutes = minutes*mult;
   hours = hours*mult + minutes/60;
   minutes %= 60;
   return *this;
}

但如果参数不是 na int,而是 floatdouble 怎么办?我想使用模板是最好的选择,而不是重载函数:

template <class T> Time Time::operator*(const T &mult)
{
   minutes = int(minutes*mult);
   hours = int(hours*mult) + minutes/60;
   minutes %= 60;
   return *this;
}

但是这样写会出现编译错误:

error LNK2019: unresolved external symbol "public: class Time __thiscall Time::operator*<int>(int const &) " (??$?DH@Time@@QBE?AV0@ABH@Z) referenced in function _main

这意味着我不能对模板使用运算符重载或者什么?

谢谢
罗伯特

最佳答案

模板就像函数的模式。在您使用它们之前,它们必须被实例化。对于您的示例,您需要使用 T=int 对 Time::operator* 进行实例化,这是通过将函数中的每个 T 替换为 int 获得的。

这个实例化有两种方式:

首先,有显式实例化,您必须在其中为要使用它的所有类型实例化模板。 T=int 的 operator* 的显式实例化如下所示:

template Time Time::operator*<int>(const int &mult);

编译器需要查看定义来实例化模板,所以这里模板函数的实现必须在同一个文件或包含文件中,但您可以将显式实例化与模板的实现放在一个实现中文件。

另一种方法是隐式实例化,模板在使用时在调用方实例化。对于此方法,模板实现必须在您使用模板时可见。实现这一点的最简单方法是将模板实现放在声明模板的头文件中。

因此您有两个选择,要么将 int 的显式实例化添加到实现文件中,要么将模板实现移到头文件中。

关于c++ - 模板类成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17472637/

相关文章:

c++ - BST 上的 "unresolved external symbol public: __thiscall",很可能是由于模板

c++ - 用两个 vector 编写结构模板

c++ - 停止代码块编译器并返回值

c++ - 指针和将 char 数组转换为 int

python - 从python中的类列表中随机选择x个项目

android - onclick 通知,在 Android 中启动一个 Activity

function - 如何在 Kotlin 中初始化嵌套数据类?

c++ - 函数模板不识别左值

c++ - 如何正确初始化模板类型的成员变量?

c++ - 从重载的 operator[](模板?)返回不同的类型