Вопрос

Я пытаюсь скомпилировать этот код:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top