错误:重载“ abs(double)”的调用不明确

时间:2019-03-23 14:39:32

标签: c++

我一直在寻找答案,但找不到适合我非常简单的情况的答案。

为什么地球上的Abs仅适用于整数?我无法执行此操作?

// Example program
#include <iostream>

using namespace std;

int main()
{
    float someVariable = abs(-4.22);
    cout << someVariable;
}

注意,我正在使用http://cpp.sh进行测试。

4 个答案:

答案 0 :(得分:2)

abs具有不同的实现方式,具体取决于其包含方式。

要获取浮点数,则需要

#include <cmath>

结果程序

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    float someVariable = abs(-4.22);
    cout << someVariable;
}

引用cppreference abs(float)

答案 1 :(得分:1)

您需要包括数学库,如下所示:

#include <cmath>

答案 2 :(得分:1)

std::abs具有以下任何一项:

  • int
  • long
  • long long
  • float
  • double
  • long double

但是,在C ++ 17之前,除非您#include <cmath>,否则只有整数重载(列出的前三个)可用。您正在传递的float可以很好地转换为其中的任何三个,因此编译器无法确定您要哪个。

如果您没有想要整数重载,则可以根据需要使用对intlonglong long的强制转换。

但是您不需要这样做:您想触发float重载,因此将其引入#include <cmath>的作用域,然后应该自动选择它,因为您要传递float

事实上,您只是很幸运,甚至整数重载都可用,因为您从未#include d <cstdlib>;您的工具链的<iostream>必须做到了恰好如此。始终根据文档提供适当的标题。

答案 3 :(得分:1)

abs()在cmath标头中声明。因此,如果要使用abs(),则需要在代码中包含cmath,如下所示:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    float someVariable = abs(-4.22);
    cout << someVariable;
}

注意:从C ++ 11和更高版本开始,我们可以通过以下方式使用abs():

double abs (double x);
float abs (float x);
long double abs (long double x);
double abs (T x);           // additional overloads for integral types

参考:http://www.cplusplus.com/reference/cmath/abs/