C++ 函數模板二(函數模板重載)


//函數模板重載
#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");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM