在c++中,為了乙個專案的規範,我們通常把**歸為三類:宣告檔案、實現檔案、測試檔案.
比如,我要用c++實現乙個鍊錶,那麼就會建立這3個檔案:
linklist.h //鍊錶的相關宣告
linklist.cpp //鍊錶的實現**
test.cpp //鍊錶測試**(本文忽略)
那麼問題來了,普通鍊錶這樣寫起來一點問題都沒有!
如果一旦,我要通過類模板來實現鍊錶(仍然用以上檔案結構),編譯器就會報錯:無法解析的外部符號.....
那麼為什麼呢???
我們先來簡單的分析一下,編譯器報的這種錯誤屬於鏈結性錯誤,也就是當程式預處理、編譯、彙編、鏈結,在鏈結時出現了錯誤.
而一般出現鏈結錯誤,通常是因為,宣告了乙個函式,但是沒有寫實現體.
因此,當程式在鏈結時,從符號表中只找到了函式名,找不到具體函式實現的位址,因此編譯器會報出這樣的錯誤!
那麼問題又來了:為什麼當模板在分離編譯時會報出這樣的錯誤呢?
我簡述一下,我們知道模板需要兩次編譯(第二篇文章提到過):
第一次編譯是在例項化之前:用來分析基本的語法錯誤,
第二次編譯是在例項化之後,當把這個型別替換之後,判斷有沒有語法錯誤.
重點就是在這裡!!!!!!!!
我們模板**的實現體在乙個檔案裡,
而例項化模板的測試**在另乙個檔案裡,
編譯器編譯乙個檔案時並不知道另乙個檔案的存在,
因此,模板**就沒有進行例項化,編譯器自然不會為其生成**,因此會丟擲乙個鏈結錯誤!
解決方法:
1.在模板標頭檔案***.h中進行顯示例項化,在模板類定義後面直接新增template class seqlist;(不推薦,老版編譯器可能不支援!)
2.將定義與宣告放到乙個檔案***.hpp裡.(推薦此方法)
好文要頂
關注我收藏該文
為什麼模板不支援分離編譯?
在c 中,為了乙個專案的規範化我們通常把 歸類為三類 宣告檔案 實現檔案 測試檔案。比如,我們要實現乙個順序表,那麼規範化就是建立3個檔案 seqlist.h 順序表相關宣告 seqlist.cpp 順序表相關實現 test.cpp 順序表測試檔案 那麼普通順序表這樣寫一點問題都沒有,用模板實現成這...
為什麼模板不支援分離編譯
在c 中,為了乙個專案的規範,我們為您通常把 歸為三類 1 宣告檔案 2 實現檔案 3 測試檔案 比如我們要用c 實現乙個鍊錶,那麼我們就會建立這3個檔案 linklist.h 鍊錶的相關宣告 lisklist.cpp 鍊錶的實現 test.cpp 鍊錶測試 如果一旦,我們要通過類模板來實現鍊錶 仍...
為什麼模板不支援分離編譯?
在c 中模板是不支援分離編譯的。在解釋這個問題之前,我們先來看看一段程式在編譯時要經歷哪些過程。1 預處理階段 生成 字尾為.i的檔案 進行巨集替換,展開標頭檔案,去掉注釋 2 編譯階段 生成 字尾為.s的檔案 檢查語法,生成彙編 3 彙編階段 生成 字尾為.o的檔案 將組合語言轉化為二進位制機器碼...