函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免了過載函式的多個函式體。它的最大特點是把函式使用的資料型別作為引數。
函式模板的宣告形式為:
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是定義模板函式的關鍵字...