Вопрос
Я пытаюсь скомпилировать этот код:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
Но GCC говорит мне:
error: 'round' is not a member of 'std'
Я знаю, что использовал round
функционировать много раз в ISO C++98 до.Необычно, round
и ::round
оба работают.
Что это дает?
Обновление:Я компилировал с g++ -std=c++98 -Wall -pedantic
.Переключение на std=c++0x
работает.
Но почему неквалифицированные/анонимные round
и ::round
оба работают, если std::round
не так ли?
Решение
То std::round
функции написаны на C++11, поэтому вам нужно будет скомпилировать с включенным C++11 или более поздним стандартом.
Другие советы
Я провел небольшое исследование, и вот что я нашел:
round
определяется в ISO C++11, поскольку он содержит ISO C99 стандартная библиотека.
round
не является частью ISO C++98, который использует ISO C90 стандартная библиотека.
Вот почему его нет в пространстве имен std
для C++98.
Но g++
является (неправильно) включающим в себя C99 заголовки, даже если они скомпилированы с помощью -std=c++98 -pedantic
, который должен отключить все нестандартные функции:
GNU_SOURCE определяется G++ и ...это подразумевает _USE_ISOC99
(из http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)
Вот почему ::round
работает.
По-видимому, это ошибка в GCC: Почему GCC разрешает использование round() в C++ даже с флагами ansi и pedantic?
Другие компиляторы C++ могут не предоставлять round
функция (поскольку она не требуется стандартом), поэтому я должен определить свою собственную.
как насчет
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
Таким образом, сравнения не будет, и оно будет округлено должным образом.
старая тема, но, возможно, полезная для тех, кто ищет в Google:
//TODO: C++11 got round() function defined in math.h
float distance = sqrt((float)(plus_x * plus_x + plus_y * plus_y));
if (distance >= floor(distance)+0.5) distance = ceil(distance);
else distance = floor(distance);
В стандарте C++03 нормативная ссылка на стандартная библиотека языка Си является ISO/IEC 9899:1990 (C90), который не включать в себя round
функция.В C++11 это ISO/IEC 9899:1999 (C99), который делает включать в себя round
функция.
Содержание <cmath>
в каждом стандарте C++ такие же, как math.h
из соответствующей стандартной библиотеки C, за исключением нескольких изменений (§26.8/4 в C++11):
Содержимое этих заголовков [
<cmath>
и<cstdlib>
] совпадают со стандартными заголовками библиотеки C<math.h>
и<stdlib.h>
соответственно [...]
Однако они находятся в области пространства имен std
(§17.6.1.2/4 в C++11):
Однако в стандартной библиотеке C++ объявления (за исключением имен, которые определены как макросы в C) находятся в пределах области видимости пространства имен (3.3.6) std пространства имен.
Итак, подводя итог, можно сказать, что round
функция недоступна в C++03, поэтому скомпилируйте с помощью -std=c++0x
вариант и ссылайтесь на него как std::round
.