1

我在 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.

想知道为什么会这样。

double 变量和 const double 之间的传递过程不一样吗?

提前致谢。

4

4 回答 4

3

既不foo(long)也不foo(float)完全适合您的参数。因为double两者都可以隐式转换long,并且float调用是雄心勃勃的。

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

请注意,您的示例过于简化。以下代码将触发您的错误消息:

double bar = 3.2;
foo(bar);

这是因为bar是一个左值,而完美匹配将是一个double&. 不过,如果您提供foo(double)重载,它将仅接受此功能。

于 2013-03-14T13:06:54.550 回答
1

foo(3.2)正在传递一个双精度数,因此编译器不知道您的意思是要调用的longorfloat版本。foo

我认为我不会过多地阅读错误。编译器告诉您它已检测到给定调用站点的可能类型,但如果有一个函数可以调用 match ,则引用将衰减foo(double)

除了为 提供重载外,您还可以使用doublea 来制作文字float3.2f

于 2013-03-14T13:06:33.467 回答
1

从这一小段代码中,我无法说出他为什么给你那个特定的错误。我试图重新创建它,但只有在没有 & 的情况下才得到它。您能否显示具有相同错误的整个代码或更大的示例?

于 2013-03-14T13:13:09.387 回答
0

你打电话时

foo(3.2);

编译器不知道您指的是哪一个 - “3.2”可以转换为浮点数或长整数。

如果您拨打电话:

foo((float)3.2);

有用。或投长,如果你想。

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

我认为您将类型 - double - 与 double 类型的变量混淆了。看看这两个例子的区别:

foo(3.2)

这里编译器告诉你没有采用 双精度类型的重载方法

double a(3.2);
foo(a);

在这一个中,您实际上是在传递变量,但是由于没有重载函数可以传入 double 类型的变量(即 double&),它告诉您没有采用double 变量的重载方法,或双&。

希望这是有道理的...

于 2013-03-14T13:05:56.980 回答