模板类成员函数

时间:2013-07-04 14:18:54

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

我有一个名为Time的班级。只有两位私人会员:int hoursint minutes。公共访问说明符仅包含添加,减去等功能。

但是有一个特定的功能不符合我的要求。它在类中声明为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

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

谢谢你 罗伯特

1 个答案:

答案 0 :(得分:0)

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

这种实例化有两种方式可以实现:

首先,有显式实例化,您必须为要使用它的所有类型实例化模板。对于T = int,运算符*的显式实例化如下所示:

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

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

另一种方法是隐式实例化,其中模板在使用它们时在调用者端实例化。对于此方法,使用模板时必须显示模板实现。实现此目的的最简单方法是将模板实现放在声明模板的头文件中。

所以你有两个选择,要么为实现文件添加int的显式实例化,要么将模板实现移动到头文件。