簡體   English   中英

模板類成員函數

[英]Template class member function

我有一堂課叫做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

這意味着我不能在模板上使用運算符重載或什么?

謝謝
羅伯特

模板就像功能的模式。 在使用它們之前,必須先實例化它們。 對於你的榜樣,你需要時間::運算符*與T = int,它是通過與你的函數替換每個T獲得一個實例int

這種實例化有兩種發生方式:

首先,有一個顯式的實例化 ,在這里您必須為要使用它的所有類型實例化模板。 T = int的運算符*的顯式實例如下所示:

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

編譯器需要查看定義以實例化模板,因此此處的模板化函數的實現必須位於同一文件或包含的文件中,但是您可以將顯式實例化與模板的實現放到實現文件中。

另一種方法是隱式實例化 ,即在使用模板時在調用者端實例化模板。 對於此方法,使用模板時,模板實現必須可見。 最簡單的方法是將模板實現放在聲明模板的頭文件中。

因此,您有兩種選擇,或者將int的顯式實例化添加到實現文件中,或者將模板實現移動到頭文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM