std :: abs用于"unsigned long long int"数据类型

mah*_*ood 6 c++ visual-studio-2010

为什么我会收到此错误

 C2668: 'abs' : ambiguous call to overloaded function
Run Code Online (Sandbox Code Playgroud)

对于像这样的简单代码

#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;
}
Run Code Online (Sandbox Code Playgroud)

删除后仍会出现错误std::.但是,如果我使用int数据类型(值较小),则没有问题.

传统的解决方案是手动检查

std::cout << (a<b) ? (b-a) : (a-b) << "\n";
Run Code Online (Sandbox Code Playgroud)

这是唯一的解决方案吗?

Bal*_*Pal 11

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

如果您的范围合适,您可以使用解决方案投射到签名长.我几乎不建议这样做,特别是如果将实现放在只执行该操作的函数中.


gx_*_*gx_ 5

你包括<cmath>并因此使用" 浮点abs ".

" 整数abs "在中声明<cstdlib>.

然而,不存在过载对unsigned long long int(两者ab是,由此a-b即得),以及用于过载long long int仅因为C++ 11存在.