当我按值传递参数时,c ++ bulid消息显示引用参数

时间:2013-03-14 13:02:54

标签: c++ codeblocks

我在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 double之间的传递过程不一样吗?

提前致谢。

4 个答案:

答案 0 :(得分:3)

foo(long)foo(float)都不适合您的参数。由于doublelong两个float都可以隐式转换,因此电话会很有野心。

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

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

double bar = 3.2;
foo(bar);

这是因为bar是左值,完美匹配是double&。但是,如果你提供foo(double)重载,它只会接受这个功能。

答案 1 :(得分:1)

foo(3.2)正在传递一个double,因此编译器不知道您是否要调用longfloat版本的foo

我不认为我读错了太多。编译器告诉你它在调用站点时检测到的可能类型,但是如果有一个函数要调用匹配的foo(double),则引用会衰减。

除了为double提供重载外,您还可以使用float

将文字设为3.2f

答案 2 :(得分:1)

从这一小段代码中我无法分辨为什么他会给你那个特定的错误。我试图重新创建它,但只有没有&amp ;.你能展示出具有相同错误的整个代码或更大的例子吗?

答案 3 :(得分:0)

致电时

foo(3.2);

编译器并不知道你指的是哪一个 - &#34; 3.2&#34;可以投入浮动或长期。

如果您拨打电话:

foo((float)3.2);

它有效。或者如果你愿意,可以施展得很久。

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

我认为你混淆了类型 - 双 - 与double类型的变量。看看这两个例子的不同之处:

foo(3.2)

这里编译器告诉你没有重载的方法需要一个 双重类型

double a(3.2);
foo(a);

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

希望有道理......