將模板化 C 類拆分為 .hpp/.cpp 檔案:可能嗎?
問題:
嘗試將模板化的C 類拆分為.hpp 和由於未定義對構造函數和析構函數的引用,. cpp 檔案會導致編譯錯誤符號。
main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()' main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()'
代碼:
stack.hpp
#ifndef _STACK_HPP #define _STACK_HPP template <typename Type> class stack { public: stack(); ~stack(); }; #endif
#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; }
ack.cpp
#include "stack.hpp" int main() { stack<int> s; return 0; }
main.cpp
的.cpp 檔案中實作模板化類別並編譯它們是不可行的。實作必須包含在 .hpp 檔案中,因為編譯器在產生模板類別的記憶體佈局和方法定義時需要了解資料類型。嘗試獨立編譯 .cpp 檔案將導致以下問題:
將不會產生帶有類別資訊的目標檔案。 連結器將找不到以下符號目標文件,建置將會失敗。 替代方案解決方案:要隱藏實作細節,請考慮分離資料結構和演算法。建立模板化類別來表示資料結構,而非模板化類別則處理演算法並利用資料結構。這使得可以在單獨的庫中隱藏基本的實作細節,而無需依賴模板類別。以上是模板化 C 類別可以拆分為 .hpp 和 .cpp 檔案嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!