如何确定调用哪个重载函数?

时间:2011-12-31 17:13:31

标签: c++ overloading

#include <iostream>
#include <cmath>
using namespace std;

float f (int a, int b) {
    return (a + b);
}

float f (float a, float b) {
    return (round(a + b));
}

int main ()
{
    cout << "Hello World!" << endl;
    int int1 = 1;
    int int2 = 2;
    float float1 = 1.2f;
    float float2 = 1.4f;
    cout << f(int1, int2) << endl;     // output: 3
    cout << f(float1, float2) << endl; // output: 2
    cout << f(int1, float2) << endl;   // output: 2
    return 0;
}
  1. 为什么最后一个输出使用f的第二个定义?

  2. 一般来说,当函数定义和函数调用之间的参数的数量和类型没有完全匹配时,如何确定将使用哪个重载函数定义?

3 个答案:

答案 0 :(得分:4)

在尝试在标准中确定为什么一个重载优先于另一个之后我得出结论它不应该,在f( int1, float2 )conv.cpp:22: error: call of overloaded ‘f(int&, float&)’ is ambiguous conv.cpp:5: note: candidates are: float f(int, int) conv.cpp:9: note: float f(float, float) 的情况下,没有过载具有比另一个更好的转换序列。代码不应该编译。如果您的编译器正在接受它,那么实现中可能存在错误。

从第二个问题开始,标准定义了可用于匹配函数调用的转换,并且还为那些用作部分排序的转换定义了 rank (称为< em>比更好的转换。编译器将始终选择最佳转换,如果没有最佳转换,则程序生成错误,如示例所示。

使用不同的编译器验证代码的模糊性:

GCC

conv.cpp:22:13: error: call to 'f' is ambiguous
    cout << f(int1, float2) << endl;   // output: 2
            ^
conv.cpp:5:7: note: candidate function
float f (int a, int b) {
      ^
conv.cpp:9:7: note: candidate function
float f (float a, float b) {
      ^

铛:

error C2666: 'f' : 2 overloads have similar conversions
          src\main.cpp(2): could be 'void f(int,int)'
          src\main.cpp(1): or       'void f(float,float)'
          while trying to match the argument list '(int, float)'

MSVS 2010(感谢Xeo):

{{1}}

答案 1 :(得分:0)

您需要知道的更多内容:http://www.learncpp.com/cpp-tutorial/76-function-overloading/

基本上选择了第二个,因为如果不可能完全匹配并且无法通过促销匹配,则通过转换(从intfloat的第一个参数)进行匹配。< / p>

答案 2 :(得分:0)

简单来说,如果您将int转换为float,则不会丢失任何信息;如果您将float转换为int,则会丢失该数字的小数部分。如果编译器找不到精确的重载匹配,它将选择导致信息丢失最少的那个。