2013-03-05 85 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;