將模板化C 類拆分為.hpp/.cpp 文件
問題:
編譯.hpp 和.cpp 檔案之間的 C模板類別拆分導致未定義的引用模板成員的錯誤函數。
代碼:
stack.hpp:
template <typename Type> class stack { public: stack(); ~stack(); };
stack..
#include <iostream> #include "stack.hpp" template <typename Type> stack<Type>::stack() { std::cerr << "Hello, stack " << this << "!" << std::endl; } template <typename Type> stack<Type>::~stack() { std::cerr << "Goodbye, stack " << this << "." << std::endl; }
stack.. 🎜 >
main.cpp:#include "stack.hpp" int main() { stack<int> s; return 0; }
答案:
解釋:
它將模板類別的實作拆分為單獨的.cpp文件進行編譯是不可行的。頭檔僅經過預處理,不包含實際程式碼。
編譯過程:編譯時,將預處理後的頭檔與.cpp 檔案結合。但是,對於模板類,編譯器需要有關模板資料類型的信息來產生記憶體佈局和方法定義。
單獨的cpp 檔案問題:移動方法定義到單獨的cpp檔案而不實例化頭檔中的範本類別將不會產生必要的目標檔案資訊.因此,連結器找不到符號,導致未定義的引用錯誤。
替代方法:要將介面與實作分離,請考慮將資料結構與演算法分離。模板類別應該僅代表資料結構。演算法可以在與模板類別互動或利用模板類別的單獨的非模板化類別庫中實現。這種方法可以隱藏有價值的實作細節。以上是為什麼在將模板化 C 類別實作分成 .hpp 和 .cpp 檔案時會出現未定義的參考?的詳細內容。更多資訊請關注PHP中文網其他相關文章!