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的信息)

Change
obj.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
for
float
可用,但是
d
for
double
@ArunA.没关系,明白了。。!!也要感谢阿兰克Stokes@AsifMushtaq我已经添加了一个小(好的,它相当大,但仍然比标准中给出的所有,它相当小)从C++标准摘录。
obj.add(5.5f);