我在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之间的传递过程不一样吗?
提前致谢。
答案 0 :(得分:3)
foo(long)
和foo(float)
都不适合您的参数。由于double
和long
两个float
都可以隐式转换,因此电话会很有野心。
您可以为double
提供额外的重载,也可以使用适当的参数类型。
请注意,您的示例过于简化。以下代码将触发您的错误消息:
double bar = 3.2;
foo(bar);
这是因为bar
是左值,完美匹配是double&
。但是,如果你提供foo(double)
重载,它只会接受这个功能。
答案 1 :(得分:1)
foo(3.2)
正在传递一个double,因此编译器不知道您是否要调用long
或float
版本的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;。
希望有道理......