c template 5 模板實戰

2021-06-29 16:04:25 字數 1681 閱讀 5200

乙份標頭檔案hpp,乙份cpp實現檔案

hpp:

#ifndef myfirst_hpp

#define myfirst_hpp

// declaration of template

template

void print_typeof (t const&);

#endif

// myfirst_hpp

cpp:

#include 

#include

#include

"myfirst.hpp"

// implementation/definition of template

template

void print_typeof (t const& x)

使用模板函式:

#include 

"myfirst.hpp"

// use of the template

int main()

將會導致鏈結錯誤,必須有乙個基於double例項化的函式定義

為了通過編譯,有2兩種辦法:

1.把cpp檔案包含在標頭檔案裡面

2.在使用模板的檔案中引用cpp檔案

3.不要cpp檔案,將宣告和實現都放在hpp檔案裡面

#define myfirst_hpp

#include

#include

// declaration of template

template

void print_typeof (t const&);

// implementation/definition of template

template

void print_typeof (t const& x)

#endif

// myfirst_hpp

開銷:

1.增加了標頭檔案的大小

2.增加了編譯複雜度

宣告乙個顯式例項化的標頭檔案

#include 

"myfirst.hpp"

// explicitly instantiate print_typeof() for type double

template void print_typeof(double const&);

現在使用這個標頭檔案,編譯正常

#include 

"myfirstinst.cpp"

// use of the template

int main()

優點:避免了龐大的標頭檔案開銷注意點:乙個程式中最多只有乙個顯式例項化體如上宣告3份檔案.

1份標頭檔案

1份實現檔案

乙份顯式例項化檔案

如下2種用法:

第一種使用應該引用「stackdef.hpp」

C Templates 模板實戰

包含模型 把模板的定義包含在宣告模板的標頭檔案裡面,即讓定義和宣告都位於同乙個標頭檔案中。如果不需要考慮建立期的時間問題,建議盡量使用包含模型來組織模板 非內聯函式模板在呼叫的位置並不會被擴充套件,而是當它們基於某種型別進行例項化之後,才產生乙份新的 基於該型別的 函式拷貝。顯式例項化 顯式例項化指...

C 模板實戰1 函式模板

模板本身不是可編譯的 而是用來指導編譯器生成可編譯 的文字。1 函式模板引數 函式模板引數可以根據模板實參自動推導,也就是說可以從實參自動推導的模板引數可以省略書寫,但是要注意以下幾個規則 1 編譯器只根據函式呼叫時給出的實參列表推導模板引數值,與函式引數無關的模板引數無法推導 2 與函式返回值相關...

C Templates學習筆記五 模板實戰

使用分離模型 讓模板定義和宣告在不同的檔案裡可能會導致鏈結錯誤。為了解決這種問題,我們把模板的宣告和定義都放在同乙個標頭檔案裡。例如 ifdef myfirst hpp define myfirst hpp include include template void print typeof t c...