《C++ primer》学习笔记之三十五:function overload resolution之三寻找最佳函数,及常见编译错

   
 3 寻找最佳函数(Best Viable Function):
    在可行集合中寻找最佳函数,这一步的判断条件是:
     1. The conversions aplied to the arguments are no worse than the conversions necessary to call any other viable function.
     2. The conversions on some arguments are better than the conversions necessary for the same arguments when any of the other viable functions are called.
    简单地说就是:转换越少越好,转换越小越好
    “少”的标准是需要转换的参数少,转换时经过的转换步骤少;
    “小”的标准是:Exact conversion < Promoting conversion < Standard conversion < User-defined conversion
     同一级的转换其等级相同,比如int->float与short->long的等级同。
    
  跟打分一样,如果所有可行函数的分数一样,那么它们都是最佳函数。
    如果有多个最佳函数,则报编译错:ambiguous call to overloaded function。
            中文:对重载函数的调用不明确
           
  如果可行函数很多,那么这一步会搞死人。避免的办法是清晰的调用,直接将参数的类型显式地转为要调用的函数的参数的类型。
  
 总结:1. 常见编译错:
    如果没找到候选函数,报: “identifier not found, even with argument-dependent lookup”
           中文:"即使使用参数相关的查找,也未找到标识符"
    如果没找到可行函数,报: “none of the number1 overloads can convert parameter number2 from type 'type'”
           中文:" 2 个重载中没有一个可以转换参数 1(从“int”类型)"
    如果找到多个最佳函数,报: “ambiguous call to overloaded function。”
           中文:" 对重载函数的调用不明确"
    2. 调用时使用scope"::"符,减少候选的函数个数;
    3. 定义函数时避免重载的函数参数交叉太多,以减少可行的函数个数
    4. 调用函数时使用显式的类型转换,以减少转换的步骤。
    5. 这里没有说模板函数、类的成员函数、模板类的成员函数,太复杂了,这里点出主要的区别:
     对于模板函数,判断它是否是候选函数除了名字相同外还要判断是否能正确地实例化它(参考模板函数的实例化),
      如果能正确地实例化,再看该实例是否定义了显式规格化模板,如果有,则该显式规格化模板是候选函数;如果没有,则实例化后的函数为候选函数。
    在寻找最佳函数式,如果由模板实例化来的函数和普通的函数“一样好”,则选普通函数;如果模板函数好些,则选模板函数;如果普通函数好些,则选普通函数。
     对于类的成员函数的调用,则找候选集合时只会到类的成员函数中去找;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值