//函數模板重載 #include<iostream> using namespace std; /* 函數模板會進行嚴格的類型匹配,模板類型不提供隱式類型轉化 普通函數能夠進行自動類型轉換 */ /* 函數模板重載四大規則 1 函數模板可以像普通函數一樣被重載 2 C++編譯器優先考慮普通函數 3 如果函數模板可以產生一個更好的匹配,那么選擇模板 4 可以通過空模板實參列表的語法限定編譯器只通過模板匹配 */ template<typename T> void Test1(T a, T b){ cout << "執行了模板函數Test1()" << endl; } void Test2(int a, int b){ cout << "執行了Test2()" << endl; } void Test1(int a, int b){ cout << "執行了普通函數Test1()" << endl; } void Test3(int a, int b){ cout << "執行了普通函數Test3()" << endl; } void ProtectA(){ int a = 1; int b = 2; char c = '3'; //Test1(a, c); 報錯 error C2782: “void Test1(T,T)”: 模板 參數“T”不明確 /* 因為 a是int型,c是char型 而函數模板要求兩個參數都是T型 就是說兩個參數的類型必須一致, 但是 int和char類型不一致 所以報錯 */ Test2(a, c);//對於普通函數而言,則可以進行隱式類型轉換,所以沒有問題 } void ProtectB(){ int a=1,b=2; char c = '3',d='4'; Test1(a, b);//這里調用普通函數 Test1<>(a, b);//這里調用模板函數--規則4 Test1(c, d);//這里調用模板函數--規則3---假設沒有模板函數 仍然會調用普通函數 Test3(c, d); } void main(){ ProtectB(); system("pause"); }