使用float给出"调用重载函数是模糊的"错误

Asi*_*taq 6 c++ overloading ambiguous

我正在重载该函数add(),但是当我使用float数据类型时它显示错误.但是,当我将其更改为时double,它的工作正常.为什么会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);
}
Run Code Online (Sandbox Code Playgroud)

错误:

In function 'int main()':
[Error] call of overloaded 'add(double)' is ambiguous
[Note] candidates are:
[Note] void students::add(int)
[Note] void students::add(float)
Run Code Online (Sandbox Code Playgroud)

Aru*_*A S 8

5.5是一个double,但你的任何一个函数都没有double参数.因此,编译器对是否使用int参数调用函数或使用参数调用函数感到困惑float.所以,你得到一个错误,说它是模棱两可的.

这就是为什么当你改变函数以获得double参数时,错误不再出现,因为现在有一个函数可以接受一个double参数,因此存在歧义.

您也可以通过调用函数来解决问题

obj.add(5.5f);
Run Code Online (Sandbox Code Playgroud)

f在数字之后添加使其成为浮点数.

我们来看看C++标准

§2.13.4

1浮动文字由整数部分,小数点,小数部分,e或E,可选的有符号整数指数和可选的类型后缀组成.整数和分数部分都由一系列十进制(十进制)数字组成.在确定其值时,将忽略数字序列中的可选分隔单引号.[例子:文字1.602'176'565e-19和1.602176565e-19具有相同的值. - 末端示例]可以省略整数部分或小数部分(不是两者); 可以省略小数点或字母e(或E)和指数(不是两者).整数部分,可选的小数点和可选的小数部分构成浮动文字的重要部分.指数(如果存在)表示要对其进行缩放的10的幂.如果缩放值在其类型的可表示值的范围内,则结果是如果可表示的缩放值,否则最接近缩放值的较大或较小可表示值,以实现定义的方式选择.除非后缀明确指定,否则浮动文字的类型为double.后缀f和F指定float,后缀l和L指定long double.如果缩放值不在其类型的可表示值范围内,则程序格式不正确.

(很抱歉发布所有内容,但你可以float通过这种方式了解更多信息)