c – 用于“unsigned long long int”数据类型的std :: abs

为什么我会收到此错误

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

这是唯一的解决方案吗?

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

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

转载注明原文:c – 用于“unsigned long long int”数据类型的std :: abs - 代码日志