【问题标题】:Using float gives "call to overloaded function is ambiguous" error [duplicate]使用浮点数会产生“对重载函数的调用不明确”错误[重复]
【发布时间】:2015-05-02 14:35:45
【问题描述】:

我正在重载函数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);
}

错误:

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)

【问题讨论】:

  • obj.add(5.5); 更改为obj.add(5.5f);
  • 5.5 是双精度而非浮点数。 5.5f 是一个浮点数。
  • Oooh Waoo Great, little change.. 你能解释一下f在float中的区别吗?
  • 既然您对正在发生的事情感到困惑,那么显然只有两种方法仅通过参数类型来区分,但做不同的事情,是一个非常非常糟糕的主意。现在考虑一下,例如 size_t 在不同的实现中可能是 unsigned int、long 或 long long,所以如果你进行这种重载,f (sizeof (1)) 可能会调用不同的方法!

标签: c++ overloading ambiguous


【解决方案1】:

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 具有 相同的值。 —end example ] 整数部分或小数部分 部分(不是两者)可以省略;小数点或字母 e (或 E )和指数(不能同时省略)可以省略。整数 部分、可选小数点和可选小数部分形式 浮动文字的重要部分。指数,如果 现在,表示重要部分的 10 的幂 被缩放。如果缩放值在可表示值的范围内 对于它的类型,如果可以表示,则结果是缩放值,否则 最接近缩放值的较大或较小的可表示值, 以实现定义的方式选择。 浮动的类型 文字是双精度的,除非后缀明确指定。这 后缀 f 和 F 指定 float,后缀 l 和 L 指定 long double. 如果缩放后​​的值不在可表示的范围内 其类型的值,程序是格式错误的。

(抱歉发了这么多,但您可以通过这种方式了解更多关于floats 的信息)

【讨论】:

  • 嗨,谢谢分配问题解决了。但是我对 f 字面量有点困惑,你能解释一下只是 float 需要 f 吗?为什么不需要加倍d?是c++语言规则吗?你能给我任何关键字来搜索它吗?或任何链接?抱歉,我是 C++ 新手
  • @AsifMushtaq ,您无法将其转换为 doubledffloat 可用,但没有 ddouble
  • @ArunA.S 好的 知道了..!!还要感谢 Alank Stokes
  • @AsifMushtaq ,我添加了一小段(好吧,它很大,但与标准中给出的所有内容相比,它仍然很小)摘自 c++ 标准。
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多