C++ 模板類的聲明與實現分離問題

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

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

一個前提

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

使用 .tpp 文件實現類模板的接口與實現的文件分離

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

template <typename Node>
class TestTemplate{
public:

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

  Node data;

  void print();
};

這是它的實現:

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

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

在 .h 文件中模板類的實現下加這一句:

#include "TestTemplate.tpp"

然后把實現放在名為 TestTemplate.tpp 文件中,即可。

使用顯式聲明實現類模板的接口與實現的文件分離

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

template class TestTemplate<int>;

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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