c 模板的定義和實現

2021-06-15 22:47:00 字數 734 閱讀 9809

注意c/c++模板的定義和實現-   -  

定義乙個類一般都是在標頭檔案中進行類宣告,在cpp檔案中實現,但使用模板時應注意目前的c++編譯器還無法分離編譯,最好將實現**和宣告**均放在標頭檔案中。如:  

test.h  

templateclass   ctest;  

test.cpp  

templatet&   ctest::getvalue()templatevoid   ctest::setvalue(const   t&   _value)  

在這兒test.cpp中的內容應放在test.h中,否則在生成最終可執行程式時就會出現錯誤(在鏈結時會出錯)。因為在編譯時模板並不能生成真正的二進位制**,而是在編譯呼叫模板類或函式的cpp檔案時才會去找對應的模板宣告和實現,在這種情況下編譯器是不知道實現模板類或函式的cpp檔案的存在,所以它只能找到模板類或函式的宣告而找不到實現,而只好建立乙個符號寄希望於鏈結程式找位址。但模板類或函式的實現並不能被編譯成二進位制**,結果鏈結程式找不到位址只好報錯了。  

《c++程式設計思想》第15章(第300頁)說明了原因:模板定義很特殊。由template<…>處理的任何東西都意味著編譯器在當時不為它分配儲存空間,它一直處於等待狀態直到被乙個模板例項告知。在編譯器和聯結器的某一處,有一機制能去掉指定模板的多重定義。所以為了容易使用,幾乎總是在標頭檔案中放置全部的模板宣告和定義。

ps: 上次就發現過這個問題,這次又忘了 。起碼vc和gcc的編譯器是不支援分開編譯的。

C 模板應用 模板定義和實現分離

關於c 中類的模板,慣常的用法都是把實現和定義放在標頭檔案裡了事。這樣的問題是,加大了標頭檔案的長度,減低了模板 的可讀性,還有就是破壞了物件導向的隱藏實現的規則。下面就是這種問題的兩個解決方案的總結。假設模板 如下 模板定義 a.h include template class ttest 模板實...

C 模板應用 讓模板定義和實現分離的方法

關於c 中類的模板,慣常的用法都是把實現和定義放在標頭檔案裡了事。這樣的問題是,加大了標頭檔案的長度,減低了模板 的可讀性,還有就是破壞了物件導向的隱藏實現的規則。下面就是這種問題的兩個解決方案的總結。假設模板 如下 1 模板定義 a.h 2 include 3 4 template 5 class...

C 模板的申明和定義

template class cqtree template cqtree cqtree template cqtree cqtree 最近寫 需要用到模板,果斷將模板的申明和定義分別寫到了.h和.cpp檔案中,後來程式總是編譯出錯。後來查詢原因,發現c 中模板和定義的實現最好寫在同一.h檔案中,其...