關於c++中類的模板,慣常的用法都是把實現和定義放在標頭檔案裡了事。這樣的問題是,加大了標頭檔案的長度,減低了模板**的可讀性,還有就是破壞了物件導向的隱藏實現的規則。下面就是這種問題的兩個解決方案的總結。
假設模板**如下:
1 // 模板定義 a.h
2 #include
3 4 template
5 class ttest
6 ... ;
12 13 // 模板實現 a.cpp
14 #include "a.h"
15 16 template
17 void ttest::output()
18 ...
22 23 // 呼叫模組 test.cpp
24 #include "a.cpp"
25 26 int main()
27 ...
複製**
注意呼叫模組test.cpp中,不要包含標頭檔案a.h直接包含a.cpp,這樣就能夠編譯成功。這是由於編譯器要建立 ttest這個型別需要模板實現,但從頭檔案裡沒找到,所以它會認為實現在其它編譯單元中,但它不會報錯,而把找實現部分的工作留給了linker。linker同樣也是找不到實現,因此就不能生成ttest。上述第一種解決方法直接包含了實現檔案,讓compiler直接找到定義和實現,這樣的效果跟把定義和實現都放在a.h裡是一樣的。
第二中方法,類似第一種,只是test.cpp只包含a.h,然後新增乙個檔案impl.cpp內容如下:
// impl.cpp
#include "a.cpp"
template class ttest;
如此一來,也能達到定義與實現分離的目的。只是也要包含a.cpp,另外隨著模板例項化不同的型別,impl,cpp中的型別也要跟著改變,有點笨拙的方法
C 模板應用 模板定義和實現分離
關於c 中類的模板,慣常的用法都是把實現和定義放在標頭檔案裡了事。這樣的問題是,加大了標頭檔案的長度,減低了模板 的可讀性,還有就是破壞了物件導向的隱藏實現的規則。下面就是這種問題的兩個解決方案的總結。假設模板 如下 模板定義 a.h include template class ttest 模板實...
C 模板定義和實現分離導致的編譯錯誤
今天在實現乙個二叉樹的時候,用到了模板,沒在意,和平時一樣寫了兩個檔案 binarytree.h,binarytree.cpp。思路和平時一樣,h檔案中定義了模板類,然後在cpp檔案中實現了一些功能函式。然後在test.cpp中測試,遇到了一些問題 問題出現如下 test binarytree.cp...
c 模板的定義和實現
注意c c 模板的定義和實現 定義乙個類一般都是在標頭檔案中進行類宣告,在cpp檔案中實現,但使用模板時應注意目前的c 編譯器還無法分離編譯,最好將實現 和宣告 均放在標頭檔案中。如 test.h templateclass ctest test.cpp templatet ctest getval...