重新安装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已应用所有更新..
答案 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>
。
至于你的问题,有两种可能的情况:
<cmath>
不再隐式包含<cstdlib>
和的版本,您的编译器基于表要求而不是26.5的隐含要求。最有可能包括<cstdlib>
将解决问题,就像在C ++ 11模式下编译一样。