После повторной установки 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 было все обновления.
В этом случае мы действительно можем многому научиться со стандарта.
C++ 98: В 26.5/Таблица 80 и 81 мы узнаем, что abs
находится в <cstdlib>
и NOT <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>
где предыдущая таблица говорит, что этого не должно быть.
Это фактически зафиксировано в C++ 11, где 26.8/Таблица 119 ясно показывает abs
как член <cmath>
а также в <cstdlib>
(хотя добавленные перегрузки для типов с плавающей точкой по-прежнему остаются эксклюзивными для <cmath>
.
Что касается вашей проблемы, есть две вероятные ситуации:
<cmath>
уже неявно включает <cstdlib>
а ваш компилятор был основан на требованиях к таблице, а не на неявных требованиях 26.5. Скорее всего, в том числе <cstdlib>
исправит проблему, как и в режиме C++ 11.