2013-03-05 69 views
2

我需要使用CMATH的ABS()函数,但Visual Studio中说,它的过载,我甚至不能使用这样的事情:问题CMATH重载函数C++

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

我不知道该怎么正确使用它。

+0

另请参见[?是的std :: ABS(0U)形成不良(http://stackoverflow.com/q/29750946/1708801) – 2015-06-03 15:25:47

回答

5

versions in <cmath>用于浮点类型,所以没有明确的最佳匹配。积分类型的过载在<cstdlib>,所以其中之一将产生良好的匹配。如果您在不同类型上使用abs,则可以同时使用includes和let overload resolution来完成其工作。

#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。真正的解决方案是使用有符号整数类型的差异,以及整数类型的重载。

2

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

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

在这种情况下,c = 5与预期的一样。

0

您可以使用三元运算:

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