如何解决方法重载中的函数调用
how to resolve function call in method overloading?
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
如果我从程序中删除未签名,那么它工作正常。
int i = 10;
float j = 1.0;
add(i,f); // working
为什么在重载函数中使用无符号变量会导致调用不明确
C++中没有所谓的unsigned float
。 float
总是signed
根据§7.1.5.2中的标准表7 C++,"签名"本身是"int"的同义词。所以编译器应该给你一个错误,即signed
或unsigned
不适用于float
。
检查这里,甚至 Ideone 也会报告错误。
error: ‘signed’ or ‘unsigned’ invalid for ‘j’
您是否有机会将此错误误解为函数调用错误ambiguos
?
如果放下unsigned float
,编译器看不到任何有参数unsigned int
&float
的匹配函数调用,所以它提升unsigned int
int
,用参数int
&float
解析对函数的调用,没有歧义。
这是 Ideone 上的代码示例。
调用是不明确的,因为您的函数签名都不匹配(由于查找有符号值(,如果它开始转换,那么它可能匹配多个签名,因此它不知道您想要哪个签名。为无符号值添加重载以避免混淆。(不太确定未签名的浮点数!
在C++中,int 表示它是有符号的。因此,当您使用无符号 int 调用时,它看到没有匹配的函数调用,并且它会尝试将无符号 int 类型提升为可能发生匹配的内容,但在这里,它无法决定它必须将自身提升为哪种数据类型,因为无符号 int 可以同时提升为 int 和 float。(我不确定那个"未签名的浮存量"(
在C++中,无符号浮点数被视为无符号 int,分数部分被截断。因此,当您调用 add (i, f( 时,它没有匹配的函数。
相关文章:
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++ 如何重载 [] 运算符并进行函数调用
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 检查类是否具有可能重载的函数调用运算符
- 避免在人为的重载函数调用中拼写出类型
- 什么时候可以使用常量装饰调用我的重载函数?
- std::调用,未找到匹配的重载函数
- 为什么使用不匹配的参数调用重载函数仍然有效
- "fpclassify":对重载函数的不明确调用
- C++ 类的构造函数和函数调用运算符 () 重载之间的歧义
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 重载函数调用编译时常量
- 为什么这些重载函数调用不明确
- 重载函数::调用哪一个
- 类中的重载函数调用运算符
- c++重载函数调用带有更多参数的自身版本
- 使用模板时C++ "const"神秘重载函数调用
- 重载函数调用操作符和赋值
- 从另一个操作符重载函数调用操作符重载函数:性能