如何解决方法重载中的函数调用?

时间:2011-06-17 04:28:48

标签: c++

void add(int,int);
void add(int ,float);
void add(float,int);

unsigned int i = 10;
unsigned float j = 1.0;
add(i,f); // ambiguios call error

如果我从程序中删除unsigned,那么它工作正常。

int i = 10;
float j = 1.0;
add(i,f); // working

为什么在重载函数中使用无符号变量会导致ambiguios调用

4 个答案:

答案 0 :(得分:7)

C ++中没有任何名为unsigned float的东西。 float始终为signed

根据§7.1.5.2中的C ++标准表7,“签名”本身是“int”的同义词。 因此,编译器应该给您一个错误,signedunsigned不适用于float

检查here,即使Ideone报告错误。

error: ‘signed’ or ‘unsigned’ invalid for ‘j’

您是否有机会将此错误误解为ambiguos函数调用错误?

如果删除unsigned float,编译器将看不到任何具有参数unsigned int&的匹配函数调用。 float,因此它将unsigned int提升为int,并使用参数int&解析对函数的调用。 float,没有歧义。

Here是Ideone上的代码示例。

答案 1 :(得分:1)

调用是不明确的,因为没有任何功能签名匹配(由于查找签名值),如果它开始投射,那么它可以匹配多个签名,因此它不知道你想要的。为无符号值添加重载以避免混淆。 (不太确定unsigned float!)

答案 2 :(得分:0)

在C ++中,int表示它已签名。因此,当您使用unsigned int调用时,它会发现没有匹配的函数调用,并且它尝试将unsigned int类型键入可能发生匹配的内容,但是在这里,它无法决定它是哪种数据类型必须提升自己,因为unsigned int可以被提升为int和float。 (我不确定那个“无符号浮动”)

答案 3 :(得分:0)

在C ++中,unsigned float被视为unsigned int,并且小数部分被截断。因此,当你调用add(i,f)时,它没有匹配的功能。