【问题标题】:"Call of overloaded function is ambiguous" even with different argument order即使参数顺序不同,“重载函数的调用也不明确”
【发布时间】:2021-07-21 17:29:05
【问题描述】:

我有一个函数fun() 我希望在同一范围内重载。根据重载规则,参数的不同顺序应该允许函数重载,如here 所述。

代码:

#include "iostream"
using namespace std;
void fun(int i, float j)
{
        cout << "int,float";
}

void fun(float i, int j)
{
        cout << "float,int";
}

int main()
{
        fun(20,20);
}

错误:

error: call of overloaded ‘fun(int, int)’ is ambiguous
   15 |         fun(20,20);

问题:

如果只有一个带有参数fun(int, float)的函数,它会被称为最佳匹配,那么为什么在这种情况下会抛出错误。

【问题讨论】:

  • 你想要哪一个? fun(20, 20.f)fun(20.f, 20)?
  • 应该将哪个20 转换为float?第一还是第二?编译器无法自行决定,两者都一样好,所以它是模棱两可的
  • “不同的参数顺序应该允许函数的重载”——是的,只要参数的相同顺序(更确切地说,参数类型) 根本不允许重载。您的歧义不是来自重载的定义,而是来自重载的调用。您教程中的示例假定您使用double, intint, double调用这些函数。
  • @inarticulatus:不,这不是解决函数重载的方式。两位候选人同样优秀,所以这个称呼是模棱两可的。 (您的 Microsoft 链接没有说明以不同方式处理第一个参数。)
  • OT:应该是 #include &lt;iostream&gt; 而不是 #include "iostream"

标签: c++


【解决方案1】:

你给了两个整数,所以编译器必须把一个转换成浮点数,但是应该取哪个函数呢?

int main()
{
  fun(20.0,20);
  fun( 20, 20.0);
}

这些调用让编译器很高兴,因为你知道应该使用哪个函数。

【讨论】:

  • 那些浮点文字不是单精度(float)而是双精度。 20.0 是双精度字面量,20.0f 是单精度字面量。
【解决方案2】:

您遇到此错误的原因是由于您提供的参数的数据类型 在这种情况下

fun(20,20);

它们都是int,int。

在这种情况下,正确的函数调用应该是,

fun(20,20.0);

fun(20.0,20);

(编辑) 正如Ivan Vnucec所提到的那样 使用浮点而不是双精度参数显式调用函数会更好 所以这样称呼它:

fun(20,20.0f);

fun(20.0f,20);

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 2012-12-19
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多