C++ 模板類的聲明與實現(xiàn)分離問題

參考:http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file

在 C++ 中定義普通的類的時候,比較清晰和普遍的做法是在 .h 文件中聲明類的接口,如果有 inline 函數(shù)也一并放在 .h 中的 class 關(guān)鍵字中。然后在 .cpp 文件中實現(xiàn) .h 中聲明的接口。
在定義模板類時,如果要將接口與實現(xiàn)分離會略有不同。如果把模板類的實現(xiàn)像普通類一樣放在 .cpp 文件中鏈接器會報錯。
有兩個方法可以實現(xiàn)模板類的接口和實現(xiàn)在文件中的分離:

一個前提

“類模板的成員函數(shù)是一個普通函數(shù)。但是類模板的每個實例都有其自己版本的成員函數(shù)。因此類模板的成員函數(shù)具有和模板相同的模板參數(shù)。因此定義在類模板之外的成員函數(shù)就必須以關(guān)鍵字 template 開始,后接類模板參數(shù)列表?!?br> ——《C++ Primer》中文版,第五版,P585

使用 .tpp 文件實現(xiàn)類模板的接口與實現(xiàn)的文件分離

比如說有這樣一個模板類,這是它的接口:

template <typename Node>
class TestTemplate{
public:

  TestTemplate(Node node):
  data(node) { }

  Node data;

  void print();
};

這是它的實現(xiàn):

template <typename node>
void TestTemplate<node>::print(){
    std::cout << "TestTemplate " << data << std::endl;
}

如果把它們分別放在 .h 和 .cpp 文件中,鏈接器會報錯,提示找不到實現(xiàn)。

在 .h 文件中模板類的實現(xiàn)下加這一句:

#include "TestTemplate.tpp"

然后把實現(xiàn)放在名為 TestTemplate.tpp 文件中,即可。

使用顯式聲明實現(xiàn)類模板的接口與實現(xiàn)的文件分離

假設(shè)上面那個類的接口與實現(xiàn)分別放在了 .h 和 .cpp 文件中。然后在 .cpp 文件中顯式的聲明要使用的模板類實例,比如:

template class TestTemplate<int>;

然后,使用 TestTemplate<int> 也可以通過編譯鏈接,但是只能使用已經(jīng)顯式聲明的模板類實例。比如如果還要使用 TestTemplate<float>,就要這樣:

template class TestTemplate<int>;
template class TestTemplate<float>;

就是說只能只用已經(jīng)顯式聲明過的模板類實例。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,690評論 1 51
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,692評論 19 139
  • 問題:什么是泛型編程?泛型編程的代表作品STL是一種高效、泛型、可交互操作的軟件組件。STL以迭代器 (Itera...
    認(rèn)真學(xué)計算機閱讀 2,156評論 0 8
  • 重新系統(tǒng)學(xué)習(xí)下C++;但是還是少了好多知識點;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme閱讀 20,467評論 0 50
  • 黑天鵝這個名詞很多人已經(jīng)如雷貫耳了,但對于從沒聽說過的人來說,確實不知道它具體代表著什么。在今天的學(xué)習(xí)中,讓我們來...
    hxleihao閱讀 786評論 0 1

友情鏈接更多精彩內(nèi)容