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

how to resolve function call in method overloading?

本文关键字:重载 函数调用 方法 何解决 解决      更新时间:2023-10-16
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 floatfloat总是signed

根据§7.1.5.2中的标准表7 C++,"签名"本身是"int"的同义词。所以编译器应该给你一个错误,即signedunsigned不适用于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( 时,它没有匹配的函数。