我包括<cmath>但无法编译std :: abs(double)</cmath>

时间:2013-11-25 17:10:50

标签: c++ stl include c++builder

重新安装Rad-Studio XE2后,我发现一些用于编译的代码不再有效。例如,我在以下内容中遇到编译器错误:

#include <cmath>

void MyClass::Rotate(double RotAngle){
  bool NotRotated = std::abs(RotAngle) < 1;
  ... do something
}

出现以下错误:

[BCC32 Error] XXX.cpp(38): E2015 Ambiguity between 'std::abs(int) at c:\program files (x86)\embarcadero\rad studio\9.0\include\windows\crtl\stdlib.h:142' and 'std::abs(__int64) at c:\program files (x86)\embarcadero\rad studio\9.0\include\windows\crtl\stdlib.h:538'

这段代码用于编译,显然应该,所以我错过了什么? Rad_studio已应用所有更新..

1 个答案:

答案 0 :(得分:1)

在这种情况下,我们实际上可以从标准中学到很多东西。

C ++ 98:在26.5 /表80和81中,我们了解到abs位于<cstdlib>而非<cmath>。但是在26.5中,我们有了一个矛盾的语句In addition to the double versions of the math functions in <cmath>, C++ adds float and long double overloaded versions of these functions, with the same semantics.,然后将abs列为<cmath>中的额外重载,前面的表说它不应该是。{/ p>

这实际上已在C ++ 11中得到修复,其中26.8 /表119清楚地显示abs成为<cmath> 的成员以及<cstdlib>中的(虽然浮点类型的添加重载仍然只显示<cmath>

至于你的问题,有两种可能的情况:

  1. 之前您正在编译为C ++ 11,而不再这样做。
  2. 您正在编译C ++ 98/03,但您的标准库已更新为<cmath>不再隐式包含<cstdlib> 的版本,您的编译器基于表要求而不是26.5的隐含要求。
  3. 最有可能包括<cstdlib>将解决问题,就像在C ++ 11模式下编译一样。