按照c++語言的習慣,普通函式以及類的宣告應該放在乙個標頭檔案中,而將其實現放在乙個主**問中,這樣便於將**分散編譯到多個模板檔案中,最後通過鏈結形成乙個完整的模板檔案。但是由於模板的實現是隨用隨生成,並不存在真正的函式實現**,如果還是按照「標頭檔案放宣告,主檔案放實現」的做法,則會導致編譯失敗。
看個例子:
解決方案:讓宣告和定義位於同乙個同檔案中myfirst.h
#pragma once
#include
#include
template
<
typename t>
void
print_typeof
(t const&)
;template
<
typename t>
void
print_typeof
(t const
&x)
main.cpp
#include
"myfirst.h"
intmain()
模板的這種組織方式叫做包含模型解決方法2:
myfirst.h
#pragma once
#include
#include
template
<
typename t>
inline
void
print_typeof
(t const
&x)
main.cpp
#include
"myfirst.h"
intmain()
解決方法3:明確生成模板例項:
修改myfirst.cpp
#include
"myfirst.h"
#include
#include
template
<
typename t>
void
print_typeof
(t const
&x)template
void
print_typeof
(double
const
&x);
從包含模型得出的另乙個結論是:
另外:兩個函式由同一模板生成,完全等價,則這兩個函式為重複模板例項
那麼,鏈結器如何識別等價的目標例項呢?
我們來看個例子:
由上面推知:鏈結器在鏈結時不考慮函式具體內容1,僅僅通過函式名、目標實參列表以及引數列表等「介面」資訊判斷兩個函式是否等價。
實際上,編譯器在編譯函式模板例項時,將根據函式名、函式引數型別以及模板引數等資訊來重新命名編譯所生成的模板函式名。這一處理方式叫做name-mangling。如果發現「介面」等價的函式(即編譯後的函式名相同),則在最終可執行**中只保留等價函式之一作為鏈結候選,而放棄其他等價函式。具體保留哪個函式是隨機的,可能與使用者輸入有關。
C C中防止標頭檔案被重複包含的方法
原部落格鏈結 為了避免同乙個檔案被include多次,c c 中有兩種方式,一種是 ifndef方式,一種是 pragma once方式。在能夠支援這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。方式一 ifndef somefile h 或寫為 if define s...
C C 避免標頭檔案重複包含的方法
在實際的程式設計過程中,因為會使用多個檔案,所以在檔案中不可避免的要引入一些標頭檔案,這樣就可能會出現乙個標頭檔案被include多次,在c c 中有幾種不同的方式可以解決這個問題,總體功能相差不大,但依然存在細微差別。格式如下 ifndef complex define complex 標頭檔案主...
C C 中標頭檔案相互包含引發的問題
今天下午遇到乙個標頭檔案相互包含而導致的編譯問題,花了我不少時間去除錯沒找到問題,最後晚上跟師兄討論不少時間,突然有所頓悟!我把問題脫離於專案簡單描述一下 我寫了乙個函式bool func classa ca 需要加到專案中,我就把這個函式的宣告放到head1.h中,函式引數型別 classa 定義...