C++ 使用float可以给出;对重载函数的调用不明确;错误
我正在重载函数C++ 使用float可以给出;对重载函数的调用不明确;错误,c++,overloading,ambiguous,C++,Overloading,Ambiguous,我正在重载函数add(),但是当我使用float数据类型时,它显示了一个错误。但是,当我将其更改为双倍时,它工作正常。为什么float会导致错误 代码是: #include <iostream> using namespace std; class students{ private: int i; float f; public: void add(int b){ i=b;
add()
,但是当我使用float
数据类型时,它显示了一个错误。但是,当我将其更改为双倍时,它工作正常。为什么float
会导致错误
代码是:
#include <iostream>
using namespace std;
class students{
private:
int i;
float f;
public:
void add(int b){
i=b;
cout << "First Int: " << i;
}
void add(float c){
f=c;
cout << "Second Int: " << f;
}
};
int main(){
students obj;
obj.add(9);
obj.add(5.5);
}
5.5
是一个double
,但是没有一个函数使用double
参数。因此,编译器不知道是使用int
参数调用函数,还是使用float
参数调用函数。所以,你会得到一个错误,说它是不明确的
这就是为什么当您将函数更改为具有double
参数时,错误不再出现,因为现在有一个函数可以接受double
参数,因此存在歧义
您还可以通过按以下方式调用函数来解决此问题:
obj.add(5.5f);
在一个数字后加上f
,使其成为浮点数
让我们看看C++标准
§2.13.4 1浮点文字由整数部分、小数点和 分数部分,e或e,可选带符号整数指数,以及 可选的类型后缀。整数部分和分数部分都由 指十进制(以十为底)数字序列。可选分离单 在确定其值时,将忽略数字序列中的引号。[ 示例:文本1.602'176'565e-19和1.602176565e-19具有 相同的值。-结束示例]整数部分或分数 部分(不是全部)可以省略;小数点或字母 e(或e)和指数(不是两者)可以省略。整数 部分、可选小数点和可选分数部分形式 浮动文字的重要部分。指数,如果 当前,表示有效部分所用的10的幂 被缩放。如果标度值在可表示值的范围内 对于其类型,结果是可表示的缩放值,否则 最接近标度值的较大或较小的可表示值, 以实现定义的方式选择浮点数的类型 除非由后缀显式指定,否则文字为双精度。这个 后缀f和f指定浮点,后缀l和l指定长 双倍。如果标度值不在可表示的范围内 对于其类型,程序的格式不正确(很抱歉发布了所有内容,但您可以通过这种方式了解更多关于
float
s的信息)Changeobj.add(5.5)代码>至<代码>对象添加(5.5f)代码>.5.5是双精度而不是浮点型5.5f
是一个浮点文本。噢,哇,太棒了,没什么变化。。你能解释一下f在float中的不同吗?因为你对正在发生的事情感到困惑,很明显,有两种方法只根据参数类型进行区分,但做不同的事情,这是一个非常非常糟糕的主意。现在考虑,例如,SIEZHETT在不同的实现上可以是无符号int、长或长,因此f(sisiof(1))如果调用这种重载,可以调用不同的方法。嗨,谢谢,问题解决了。。但我对f有点困惑,你能解释一下,f只是浮点数吗?为什么不要求双d?是C++语言规则吗?你能给我一些关键字来搜索它吗?或者任何链接?对不起,我是c++@AsifMushtaq新手,你不能用d
将它转换成double
,f
forfloat
可用,但是d
fordouble
@ArunA.没关系,明白了。。!!也要感谢阿兰克Stokes@AsifMushtaq我已经添加了一个小(好的,它相当大,但仍然比标准中给出的所有,它相当小)从C++标准摘录。
obj.add(5.5f);