在c++中,為了乙個專案的規範化我們通常把**歸類為三類:宣告檔案、實現檔案、測試檔案。
比如,我們要實現乙個順序表,那麼規範化就是建立3個檔案:seqlist.h (順序表相關宣告)、seqlist.cpp(順序表相關實現)、test.cpp(順序表測試檔案)。
那麼普通順序表這樣寫一點問題都沒有,用模板實現成這樣的順序表是否也是沒有任何問題的呢?
可事實是一旦我們通過模板來實現這樣的順序表,編譯器就會報錯。這是為什麼呢???
首先我們來看乙個例項:
宣告檔案
templateclass aa
; 實現檔案
#include"test.h"
templateaa::aa()
:_a(0)
{} 測試檔案
#include#include"test.h"
using namespace std;
int main()
會出現如下錯誤:
我們來簡單分析一下,編譯器報的這種錯誤屬於鏈結性錯誤,也就是說預處理、編譯、彙編、鏈結,在鏈結時出了錯,而一般出現出現鏈結錯誤是因為宣告了乙個函式,但是沒有實現它。因此,當程式在鏈結時,從符號表中只找到了函式名,找不到具體函式實現的位址,因此編譯器會報這樣的錯誤。那麼,為什麼模板在分離編譯時會報這樣的錯誤呢?
我們都知道模板需要兩次編譯,第一次編譯是在例項化之前,用來檢查基本的語法錯誤。第二次編譯是在例項化之後,當把它例項化具體的型別時,再次判斷有沒有語法錯誤。
模板**的實現在實現檔案裡,而例項化的測試**在測試檔案裡,編譯器編譯時並不知道它們是分開的,也就是編譯實現檔案時並不知道例項化**在測試檔案裡,就沒有例項化出真正的**,因此才會報出這樣的錯誤。
解決辦法:
(1)在模板的實現檔案裡顯示例項化;
(2)將定義和宣告放在同乙個檔案裡,命名為***.hpp;
為什麼模板不支援分離編譯
在c 中,為了乙個專案的規範,我們通常把 歸為三類 宣告檔案 實現檔案 測試檔案.比如,我要用c 實現乙個鍊錶,那麼就會建立這3個檔案 linklist.h 鍊錶的相關宣告 linklist.cpp 鍊錶的實現 test.cpp 鍊錶測試 本文忽略 那麼問題來了,普通鍊錶這樣寫起來一點問題都沒有 如...
為什麼模板不支援分離編譯
在c 中,為了乙個專案的規範,我們為您通常把 歸為三類 1 宣告檔案 2 實現檔案 3 測試檔案 比如我們要用c 實現乙個鍊錶,那麼我們就會建立這3個檔案 linklist.h 鍊錶的相關宣告 lisklist.cpp 鍊錶的實現 test.cpp 鍊錶測試 如果一旦,我們要通過類模板來實現鍊錶 仍...
為什麼模板不支援分離編譯?
在c 中模板是不支援分離編譯的。在解釋這個問題之前,我們先來看看一段程式在編譯時要經歷哪些過程。1 預處理階段 生成 字尾為.i的檔案 進行巨集替換,展開標頭檔案,去掉注釋 2 編譯階段 生成 字尾為.s的檔案 檢查語法,生成彙編 3 彙編階段 生成 字尾為.o的檔案 將組合語言轉化為二進位制機器碼...