账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    两个函数模板重载原则?
    32
    0

    对于函数重载,一般依据函数形参列表来确定,那么对于函数模板也应该这样吧,可是对于下面的代码
    当调用函数compare( "ab", "ab" )报错,调用compare( "ab", "abc" )就对了,不清楚为什么int compare( const T& v1, const T& v2 ) 匹配不上,因为推断出了字符串数组长度,认为第二个更精确??这种差别编译器也能发现?

    #include "pch.h"
    #include <iostream>
    
    template <typename T>
    int compare( const T& v1, const T& v2 ) {
        if ( v1 < v2 ) return -1;
        if (v1 > v2) return 1;
        return 0;
    }
    
    
    template<unsigned N, unsigned M>
    int compare(const char(&p)[N], const char(&p2)[M]) {
        std::cout << p << "  " << p2 << std::endl;
        return strcmp(p, p2);
    }
    
    int main()
    {
        //int res2 = compare( "ab", "ab" );//有多个与函数与之匹配
    }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ジ世中沉沦〆 普通会员 1楼

      两个函数模板重载原则是指在同一作用域内,函数模板可以有不同的定义,但函数参数列表和返回类型必须相同。

      这是为了保证代码的可读性和可维护性。函数模板是C++中一个重要的特性,它可以用来创建各种类型的函数,如析构函数、赋值函数等。但是,由于C++的编译器可能需要根据编译器的选项来确定函数模板的类型,因此,不同类型的函数模板在编译时可能会有不同的行为。

      如果在同一个作用域内定义了两个不同的函数模板,编译器可能会报错,因为它们的参数列表和返回类型不同。因此,必须确保它们的参数列表和返回类型相同,才能让编译器正确地识别它们。

      另外,如果函数模板有不同的定义,可能会导致代码的混淆。因此,应该尽量避免在同一个作用域内定义不同的函数模板。如果必须定义不同的函数模板,应该使用函数指针或函数引用来代替,这样可以避免函数之间的混淆。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部