1. 程式人生 > >[C++]模板類的宣告與實現分離問題

[C++]模板類的宣告與實現分離問題

本文,記錄C++模板類的實現。 實驗環境:
  1. linux
  2. g++
  3. c++98
模板類的宣告與實現分離錯誤 目的:實現一個bag類 做法:模板類bag的宣告與實現分離,也就是.cpp和.h檔案分離 此時,編譯失敗。 將.cpp和.h取消(亦即取消宣告與實現的分離) 此時,編譯成功,執行正常。 馬上查詢資料,收集整理如下:
  1. C++ 中的模板類宣告標頭檔案和實現檔案分離後,如何能實現正常編譯? ,連結
  2. Splitting templated C++ classes into .hpp/.cpp files--is it possible? ,連結
  3. C++模板的編譯問題,連結
結論:
  1. 不行滴
原因:
  1. 具體看第一個連結,說明是:模板類是根據不同的type來編譯多份的.o檔案,根據需要連結
  2. 而這做法的根本原因是:C++和C一樣是靜態編譯語言,不能動態解析。
  3. 再具體的原因,可以深入:
    1. 編譯連結
    2. C++模板類的“例項化”過程
解決辦法:
  1. 全部寫到標頭檔案裡面即可(我使用linux g++ c++98,不行,具體繼續看下面)
  2. 如果還不滿意,感覺與以往的.c與.h檔案分離有違背規範,可以參考stl做法(鑑於水平,我就不弄了)
拓展:
  1. 相反,普通的class是可以將宣告與實現分類的
  2. 因為普通的class僅僅是針對一個type,不需要編譯多份.o檔案。
驗證與解決思路 最終方案:
  1. .cpp存實現
  2. .h存宣告
  3. 呼叫include “xxx.cpp”
此時,完成了宣告和實現分離