dongdongxhh1 2017-07-06 01:27 采纳率: 0%
浏览 762

C++里面模板函数怎么重载一个非模板函数 ?

C++里面模板函数怎么重载一个非模板函数,是根据返回值判断函数的重载调用的么?

  • 写回答

1条回答 默认 最新

  • chen_daisy 2017-07-06 01:36
    关注

    //函数模板
    template
    T MyPlus(T a, T b){
    T ret = a + b;
    return ret;
    }

    //普通函数
    int MyPlus(int a, int b){
    int ret = a + b;
    return ret;
    }

    void test03(){
    int a = 10;
    int b = 20;
    char c = 'a';
    char d = 'b';
    //如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数
    cout << MyPlus(a, b) << endl;
    //如果我必须要调用函数模板,那么怎么办?
    cout << MyPlus<>(a, b) << endl;
    //此时普通函数也可以匹配,因为普通函数可以自动类型转换
    //但是此时函数模板能够有更好的匹配
    //如果函数模板可以产生一个更好的匹配,那么选择模板
    cout << MyPlus(c,d);
    }

    //函数模板重载
    template
    T MyPlus(T a, T b, T c){
    T ret = a + b + c;
    return ret;
    }

    void test04(){

    int a = 10;
    int b = 20;
    int c = 30;
    cout << MyPlus(a, b, c) << endl;
    //如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数
    

    }

    那么优先级和匹配怎么发生的?为什么函数模板可以和普通函数放在一起?c++编译器是如何实现函数模板机制的?

    #include
    using namespace std;

    template
    T MyPlus(T a,T b){
    T ret = a + b;
    return ret;
    }

    int main(){

    int a = 10;
    int b = 20;
    MyPlus(a,b);
    
    char c = 'a';
    char d = 'b';
    MyPlus(c,d);        
    
    return 0;
    

    }

    通过上面的例子我们可以发现几点:
     编译器并不是把函数模板处理成能够处理任何类型的函数
     函数模板通过具体类型产生不同的函数
     编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译。
    编译器根据函数的调用情况,产生具体函数,这个具体函数根据类型产生。

    关于函数的重载机制,是一个比较复杂的问题,其中涉及到了优先级定义和最佳匹配等问题,以下链接时几个大神的回答。
    http://www.cnblogs.com/liyuan989/p/4138378.html

    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻看一个题
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)