為什麼模板不支援分離編譯?

2021-08-04 23:05:23 字數 1016 閱讀 1047

在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的檔案 將組合語言轉化為二進位制機器碼...