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

Bha*_*rat 7 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
Run Code Online (Sandbox Code Playgroud)

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

int i = 10;
float j = 1.0;
add(i,f); // working
Run Code Online (Sandbox Code Playgroud)

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

Alo*_*ave 7

unsigned float在C++中没有任何东西.float总是signed

根据§7.1.5.2中的C++标准表7,"签名"本身就是"int"的同义词. 所以编译器应该给你一个错误,那个signedunsigned不适用float.

检查这里,即使Ideone报告错误.

error: ‘signed’ or ‘unsigned’ invalid for ‘j’
Run Code Online (Sandbox Code Playgroud)

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

如果你放弃了unsigned float,编译器无法看到任何匹配函数调用具有参数unsigned intfloat,所以它促进unsigned intint解析该调用与参数的函数intfloat,没有歧义.

是Ideone上的代码示例.


Bal*_*ash 0

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