当我按值传递参数时,c++构建消息显示一个引用参数

c++ bulid message shows a reference argument while i pass arguments by value

本文关键字:参数 一个 显示 引用 构建 按值传递 c++ 消息      更新时间:2023-10-16

我在Code::Blocks下使用GNU GCC编译器。

    int foo(long s){cout<<"long"<<endl;return 0;}
    int foo(float s){cout<<"float"<<endl;return 0;}
    int main()
    {
        double a(3.2);
        foo(a);
        return 0;
    }
我知道这会触发模棱两可的错误,但是构建消息告诉我
error: call of overloaded 'foo(double&)' is ambiguous

我确实是按双变量的值传递实参,而不是像上面那样通过引用传递实参。

当我使用const double类型时:

foo(3.2);  // enclosed in main function

构建消息告诉我如下错误:

error: call of overloaded 'foo(double)' is ambiguous.

不知道为什么会这样。

传递过程在双精度变量和const双精度变量之间不一样吗?

foo(long)foo(float)都不完全符合您的参数。由于double可以隐式地转换longfloat,所以调用是雄心勃勃的。

您可以为double提供额外的重载,或者使用适当的参数类型。

注意,您的示例过于简化了。下面的代码将触发错误消息:
double bar = 3.2;
foo(bar);

这是因为bar是左值,而完美匹配的是double&。但是,如果您提供foo(double)重载,它只会接受这个函数。

foo(3.2)传递的是双精度类型,所以编译器不知道你是指要调用foolong还是float版本。

我想我不会过分解读这个错误。编译器告诉你一个可能的类型,它已经检测到给定的调用位置,但是如果有一个匹配foo(double)的函数调用,引用将衰减。

除了为double提供重载之外,还可以使用3.2f

使文字成为float

从这一小段代码我不能告诉他为什么给你那个特定的错误。我试着重新创造它,但没有& &;你能展示整个代码或一个更大的例子,有相同的错误吗?

当你调用

foo(3.2);

编译器不知道你指的是哪一个-"3.2"可以强制转换为float或long类型。

如果你打电话:

foo((float)3.2);

它的工作原理。

你的问题似乎是为什么错误是关于双&-这是因为你的双变量与foo(double&)的重载最接近。

我想你把double类型和类型的变量混淆了。看看这两个例子中的区别:

foo(3.2)

这里编译器告诉你没有重载的方法接受a<<strong>双类型/strong>

double a(3.2);
foo(a);

在本例中,实际上是传入变量,但由于没有重载函数可以传入double类型的变量(即double&),因此它告诉您没有重载方法接受双变量或double&

相关文章: