【发布时间】:2013-06-19 10:37:18
【问题描述】:
为什么会出现这个错误
C2668: 'abs' : ambiguous call to overloaded function
对于这样的简单代码
#include <iostream>
#include <cmath>
int main()
{
unsigned long long int a = 10000000000000;
unsigned long long int b = 20000000000000;
std::cout << std::abs(a-b) << "\n"; // ERROR
return 0;
}
删除std:: 后错误仍然存在。但是,如果我使用 int 数据类型(具有较小的值)没有问题。
传统的解决方案是手动检查
std::cout << (a<b) ? (b-a) : (a-b) << "\n";
这是唯一的解决方案吗?
【问题讨论】:
-
为什么要
abs一个无符号类型? (不是反问) -
@Mario 他们想要消除两个无符号值之间的差异。
-
无符号类型不是环绕吗?
a-b的结果不是-10000000000000而是std::numeric_limits<unsigned long long>::max()-10000000000000(仍然是 unsigned long long)。 -
@mahmood 请注意
<<的优先级高于?:,因此请记住括号! en.cppreference.com/w/cpp/language/operator_precedence