C++ 标准::abs代表“标准”;“无符号长整型”;数据类型

C++ 标准::abs代表“标准”;“无符号长整型”;数据类型,c++,visual-studio-2010,C++,Visual Studio 2010,为什么我要得到这个错误 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 <<

为什么我要得到这个错误

 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;
}

这是唯一的解决方案吗?

< P>因为在C++之前,你以前使用了ABS、FAB、实验室,每种不同的类型,C++允许ABS过载,在这种情况下,它不理解或不满意你的过载。 使用
labs(a-b)
鉴于您正在使用long,这应该可以解决您的问题。

您正在包括
,因此使用“”

“”在
中声明


但是,
无符号long long int
没有重载(a和
b
都是,因此
a-b
也是),而
long long int
的重载只在C++11之后才存在。

检查似乎是唯一真正好的解决方案。替代方案需要比您的类型大的类型和非标准扩展才能使用它


如果你的射程合适,你可以选择铸造签名长距离的解决方案。我几乎不建议这样做,尤其是如果将实现放在一个只执行该操作的函数中。

首先,您需要包含正确的头。正如gx所指出的,
有一个浮点abs,在我的编译器上它实际上是编译的,但结果可能不是您所期望的:

1.84467e+19
改为包含
。现在的错误是:

main.cpp:7:30: error: call of overloaded ‘abs(long long unsigned int)’ is ambiguous
main.cpp:7:30: note: candidates are:
/usr/include/stdlib.h:771:12: note: int abs(int)
/usr/include/c++/4.6/cstdlib:139:3: note: long int std::abs(long int)
/usr/include/c++/4.6/cstdlib:173:3: note: long long int __gnu_cxx::abs(long long int)
如您所见,此函数没有
无符号
重载,因为计算
无符号
类型的绝对值毫无意义

我看到一些答案建议您将
无符号的
类型转换为有符号的类型,但我相信这是愚蠢的,除非您真的知道自己在做什么!
首先让我问一下,您要操作的
a
b
值的预期范围是多少?如果两者都低于
2^63-1
,我强烈建议只使用
long-long-int
。但是,如果这不是真的,请注意,您的值程序:

a=0, b=1


将产生完全相同的结果,因为实际上需要65位来表示2个64位值之差的任何可能结果。如果您可以确认这不会成为问题,请按照建议使用演员阵容。但是,如果您不知道,您可能需要重新思考您实际想要实现的目标。

为什么要
abs
一个无符号类型??(不是一个反问)@Mario他们想找出两个无符号值之间的差异。无符号类型不是在绕圈子吗?
a-b
的结果不是
-100000000000
,而是
std::numeric\u limits::max()-100000000000
(仍然是无符号长-长)。@mahmood注意
@mahmood Yes,如果along
long
不同。C++11在
cmath
中提供了一个整数重载,尽管
gcc
是唯一实现此功能的工具。
a=0, b=1
a=2^64-1, b=0