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

C++中模板宣告與實現的分離問題

問題:

初學C++,依據《C++ primer》的例子在VS2010上實現泛型控制代碼類Handle是,將模板的宣告與實現分別放在.h和.cpp檔案中,並在.h的模板類之後新增“#include XX.cpp”;第一次編譯成功,但當我第二次編譯時出錯。


參閱資料之後。得出兩種解決方案

(1)新增巨集命令。出現上面的錯誤是因為我在原始檔(.cpp檔案)中添加了“#include “XX.h”。但如果我不包含標頭檔案的話,原始檔就看不到標頭檔案,也會出現編譯錯誤。參考http://blog.csdn.net/microsues/article/details/6078385 可以在標頭檔案中模板類之後的“#include XX.cpp”前面新增一個巨集“#define NAME”,然後在原始檔中去掉“#include “XX.h”,並在模板實現程式碼前後分別新增“ifdef NAME ”和“#endif”。此時可以編譯通過。這種方法適用VS2010,不是所有的編譯器都適合。這和《C++ primer》上寫的不一致。可能是VC不能很好的支援“包含”模型。

(2)將模板的宣告和實現寫在同一個標頭檔案中。

因為編譯模板時,需要知道模板的定義。為了簡化模板,可以先寫模板類,然後在模板類之後實現模板。為了實現介面和實現分離,可以分離類的資料結構和演算法。類模板只表示資料結構,將演算法的實現細節隱藏非模板類庫裡。即模板類只用很少的程式碼來儲存資料,其他的工作交給演算法類。