Я включаю <cmath>, но не могу скомпилировать std :: abs (double)

0

После повторной установки 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
    Вы пробовали явно приводить RotAngle как int или __int64 при передаче его в abs?
Теги:
include
stl
c++builder

1 ответ

1

В этом случае мы действительно можем многому научиться со стандарта.

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>.

Что касается вашей проблемы, есть две вероятные ситуации:

  1. Вы компилировались как C++ 11 раньше и больше не делаете этого.
  2. Вы компилировали C++ 98/03, но ваши стандартные библиотеки были обновлены до версии, где <cmath> уже неявно включает <cstdlib> а ваш компилятор был основан на требованиях к таблице, а не на неявных требованиях 26.5.

Скорее всего, в том числе <cstdlib> исправит проблему, как и в режиме C++ 11.

  • 0
    насколько я могу судить, XE2 - это только c ++ 98. Я попытался включить оба файла, и проблема остается.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню