C 模板定義和實現分離導致的編譯錯誤

2021-07-15 10:00:55 字數 853 閱讀 1789

今天在實現乙個二叉樹的時候,用到了模板,沒在意,和平時一樣寫了兩個檔案:binarytree.h,binarytree.cpp。思路和平時一樣,h檔案中定義了模板類,然後在cpp檔案中實現了一些功能函式。

然後在test.cpp中測試,遇到了一些問題、

問題出現如下:

test_binarytree.cpp:(.text+0x16e): undefined reference to `binarytreestring>::binarytree()'

......

網上查的資料如下:

編譯器不支援模板類定義和實現的分離,即類定義和實現不能分開放在h標頭檔案和cpp原始碼檔案中;

經過測試,貌似把cpp檔案的東西都搬到.h檔案中,如果cpp檔案還在,都還會提示該問題,所以,除了.h中放實現**之外,還得把空的cpp檔案刪除。

從專案中刪除後編譯成功,但後來重新增加這個.cpp檔案,貌似還是能編譯成功。

上述的說法親測正確,但仍有不足,補充資料留作記錄:

首先c++中有分離編譯的概念:

export關鍵字

標準 c++ 為此制定了「模板分離編譯模式(separation model)」及 export 關鍵字。然而由於 template 語義本身的特殊性使得 export 在表現的時候效能很次。

用法此處就不說了,因為c++標準在11中將其丟棄了,所以不建議使用。

另外網上還有一些包含cpp檔案的做法之類的,也不做介紹,我覺得不夠規範化。因為模板的制定本身就是應該為例項化而開源。所以我比較贊同將模板類的定義和實現放在同乙個檔案的做法。

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

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

C 模板分離編譯

乙個程式 專案 由若干個原始檔共同實現,而每個原始檔單獨編譯生成目標檔案,最後將所有目標檔案鏈結起來形成單一的可執行檔案的過程稱為分離編譯模式。假如有以下場景,模板的宣告與定義分離開,在標頭檔案中進行宣告,原始檔中完成定義 a.h template class t t add const t lef...

C 模板的分離編譯

首先,在c 中,為了乙個專案的規範,我們通常把 歸為三類 宣告檔案 實現檔案 測試檔案。比如,我要用c 實現乙個鍊錶,那麼就會建立這3個檔案 linklist.h 鍊錶的相關宣告 linklist.cpp 鍊錶的實現 test.cpp 鍊錶測試 那麼問題來了,普通鍊錶這樣寫起來一點問題都沒有 如果一...