C 模板 32 普通函式和模板函式呼叫規則

2021-10-06 23:57:16 字數 1682 閱讀 2337

1.如果普通函式和模板函式都可以呼叫,優先呼叫普通函式。

下面**,普通函式和模板函式名稱一樣,傳入引數也一致,執行**是呼叫模板函式還是普通函式

#include using namespace std;

//模板函式

template void myadd(t a, t b)

//普通函式

void myadd(int a, int b)

void test01()

int main()

編譯執行

說明,如果普通函式和模板函式都可以呼叫,預設優先呼叫普通函式。

2.可以通過空模板引數列表,強制呼叫模板函式

如果上面的情況,我們不想預設使用普通函式,那麼就需要使用空模板函式,強制顯示呼叫模板函式

#include using namespace std;

//模板函式

template void myadd(t a, t b)

//普通函式

void myadd(int a, int b)

void test01()

int main()

上面第19行使用了<>,也就是空模板引數列表。 編譯執行

3.函式模板也可以發生函式過載

我們前面學習過普通函式的過載,函式模板也可以發生過載。

#include using namespace std;

//模板函式

template void myadd(t a, t b)

template void myadd(t a, t b, t c)

//普通函式

void myadd(int a, int b)

void test01()

int main()

上面模板函式發生過載,引數個數不一樣。

4.如果函式模板可以產生更好匹配,優先呼叫函式模板

有時候編譯器認為呼叫普通函式和模板函式都可以,只不過普通函式可以需要隱式轉換,而模板函式如果推導出來型別,也是可以呼叫。這種情況下,編譯器覺得模板更好匹配,隱式轉換太麻煩,所以會優先呼叫函式模板

#include using namespace std;

//模板函式

template void myadd(t a, t b)

//普通函式

void myadd(int a, int b)

void test01()

int main()

前面學習過 char在一定範圍內是可以隱式轉換為int型別,所以在test01()中,編譯器認為兩個函式都可以呼叫,但是模板匹配更好,所以這裡有點呼叫了模板函式。

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

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

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

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

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

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