C 函式模板和模板函式

2021-07-09 04:14:03 字數 2528 閱讀 2802

函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免了過載函式的多個函式體。它的最大特點是把函式使用的資料型別作為引數。

函式模板的宣告形式為:

template

《返回型別》《函式名》(參數列)

其中,template是定義模板函式的關鍵字;template後面的尖括號不能省略;

例如:

template

t fuc(t x, int y)

如果主調函式中有以下語句:

double d;

int a;

fuc(d,a);

則系統將用實參d的資料型別double去代替函式模板中的t生成函式:

double fuc(double x,int y)

函式模板只是宣告了乙個函式的描述即模板,不是乙個可以直接執行的函式,只有根據實際情況用實參的資料型別代替型別引數識別符號之後,才能產生真正的函式。

關鍵字typename也可以使用關鍵字class,這時資料型別引數識別符號就可以使用所有的c++資料型別。

函式模板允許使用多個型別引數,但在template定義部分的每個形參前必須有關鍵字typename或class,即:

template

《返回型別》《函式名》(參數列)

在template語句與函式模板定義語句《返回型別》之間不允許有別的語句。如下面的宣告是錯誤的:

template

int i;

t min(t x,t y)

模板函式類似於過載函式,但兩者有很大區別:函式過載時,每個函式體內可以執行不同的動作,但同乙個函式模板例項化後的模板函式都必須執行相同的動作。

函式模板的資料型別引數識別符號實際上是乙個型別形參。模板函式的生成就是將函式模板的型別形參例項化的過程。

函式模板中的模板形參可例項化為各種型別,但當例項化模板形參的各模板實參之間不完全一致時,就可能發生錯誤,如:

template

t max(t a, t b)

void func(int i, char j)

例子中的後兩個呼叫是錯誤的,出現錯誤的原因是,在呼叫時,編譯器按最先遇到的實參的型別隱含地生成乙個模板函式,並用它對所有模板函式進行一致性檢查,例如對語句

max(i, j);

先遇到的實參i是整型的,編譯器就將模板形參解釋為整型,此後出現的模板實參j不能解釋為整型而產生錯誤,此時沒有隱含的型別轉換功能。解決此種異常的方法有兩種:

[cpp]view plain

copy

template

<

class

t,class

d>  

t max(t a,d b)    

呼叫:

[cpp]view plain

copy

inta;

float

b;  

max(a,b)  

[cpp]view plain

copy

template

<

class

t>  

t max(t a,t b)  

intmax(

int,

int);

//使用者自己定義乙個同名函式

[cpp]view plain

copy

引數呼叫:

intm,n;  

char

a,b;  

char

s[10];  

max(m,n);//呼叫函式 實參和函式的引數型別完全一致,直接呼叫函式

max(a,b);//呼叫模板 實參和函式引數型別不同,直接呼叫模板

max(m,a);//呼叫函式 實參的型別不同,模板不適合,則再次呼叫函式(使用型別轉換)

max(m,s);//報錯-函式也不適合,直接報錯

分析:呼叫函式時的順序:

先呼叫函式 ---  其次套用模板  --- 再呼叫函式 --- 報錯

1、如果呼叫語句的實參型別和函式型別完全一致,這時不找模板,而優先使用函式。 2、

如果呼叫語句的實參型別和函式型別不一致,則尋找模板

3、如果呼叫語句的實參各自型別不同,無法使用模板。則應重新呼叫函式,並試著使用型別轉換

4、如果型別轉換也不成功,則報錯

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...