cmath重载函数C ++的问题

时间:2013-03-05 07:17:05

标签: c++ math overloading

我需要使用cmath的abs()函数,但Visual Studio说它已经超载了,我甚至无法使用这样的东西:

unsigned a = 5, b = 10, c;
c = abs(a-b);

我不知道如何正确使用它。

3 个答案:

答案 0 :(得分:5)

versions in <cmath>用于浮点类型,因此没有明确的最佳匹配。整数类型的重载在<cstdlib>中,因此其中一个将产生良好的匹配。如果您在不同类型上使用abs,则可以同时使用包含和重载解析来完成其工作。

#include <cmath>
#include <cstdlib>
#include <iostream>

int main()
{
  unsigned int a = 5, b = 10, c;
  c = std::abs(a-b);      
  std::cout << c << "\n"; // Ooops! Probably not what we expected.
}

另一方面,这不会产生正确的代码,因为表达式a-b不会调用integer promotion,因此结果是unsigned int。真正的解决方案是使用带符号的整数类型来表示差异,以及整数类型std::abs重载。

答案 1 :(得分:2)

正如您所看到的here,没有带有无符号整数的cmath函数abs。这是因为无符号整数从不是负数。请尝试执行以下操作:

int a = 5, b = 10;
int c = abs(a-b);

在这种情况下,c = 5符合预期。

答案 2 :(得分:0)

您可以使用三元运算符:

c = (a > b) ? a - b : b - a;