函式模板的隱式例項化和顯式例項化

2021-09-25 21:19:16 字數 1328 閱讀 2349

一.隱式例項化:

1 #include 2 #include 3 using namespace std;

4 5 template 6 bool compare(t a,t b)

7 13

14 int main()

15

以上 compare(100,220), compare(120,99),compare(999,100.0)等

都屬於隱式的例項化,產生相應型別的模板函式.

二.顯式例項化:

我們知道,一般的我們都將模板相關的都放在乙個標頭檔案中供使用者包含使用,如stl等

在這裡建立兩個原始檔,template.cc 和 main.cc ,內容如下:

//不進行編譯,就不會產生任何型別的函式,自然就不會產生符號了,鏈結時一定會找不到符號

template bool compare(t a,t b)

//宣告

templatebool compare(t a,t b);

int main()

正常情況下,這樣的**是編譯不通過的,因為函式模板不編譯,所以就不會產生符號,

這樣在main.cc中壓根就找不到compare各個型別的函式符號.

產生乙個鏈結時的錯誤,即找不到模板函式的符號.說白了就是找不到函式的定義.

所以,我們可以在template.cc中就把各個型別的函式產生出來,也就是在template.cc中顯式的例項化出這些函式.

如何,顯式例項化產生這些型別的函式**呢?

template bool compare(t a,t b)

//顯式例項化

template bool compare(int,int);

template bool compare(float,float);

template bool compare(double,double);

//我們知道,程式編譯的時候各個cpp檔案是單獨編譯的

//當編譯到該檔案的時候,編譯器看到這三行**後,會產生三種模板函式

//型別分別為int float double

//這樣當我在其他原始檔呼叫的時候,自然就不會產生鏈結的錯誤了,因為符號已經產生了.

總結:

C 函式模板的隱式例項化 顯式例項化與顯式具體化

一 什麼是例項化和具體化?為進一步了解模板,必須理解術語例項化和具體化。1 例項化 在程式中的函式模板本身並不會生成函式定義,它只是乙個用於生成函式定義的方案。編譯器使用模板為特定型別生成函式定義時,得到的是模板例項。這即是函式模板的例項化。而函式模板例項化又分為兩種型別 隱式例項化和 顯式例項化 ...

C 模版 顯式例項化 顯式具體化 隱式例項化

helloword的部落格 函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式...

C 模版 顯式例項化 顯式具體化 隱式例項化

helloword的部落格 函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式...