'round' не является членом 'std'

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

#include <cmath>
double gravity (double level) {
    return 0.02 * std::round(level);
}

Но GCC говорит мне:

error: 'round' is not a member of 'std'

Я знаю, что раньше я использовал функцию round в ISO С++ 98. Необычно, round и ::round работают.

Что дает?

Обновление: я компилировался с помощью g++ -std=c++98 -Wall -pedantic. Переход на std=c++0x работает.

Но почему работают неквалифицированные/анонимные round и ::round, если std::round не работает?

Ответы

Ответ 1

std::round - это С++ 11, поэтому вам нужно будет скомпилировать с помощью -std=c++0x или использовать round без std.

Ответ 2

Я провел немного исследований, вот что я нашел:

round определяется в ISO С++ 11, так как он содержит стандартную библиотеку ISO C99.

round не входит в ISO С++ 98, который использует стандартную библиотеку ISO C90.

Вот почему это не в пространстве имен std для С++ 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() в С++ даже с флагами ansi и pedantic?

Другие компиляторы С++ могут не предоставлять функцию round (поскольку она не требуется стандартом), поэтому я должен определить свой собственный.

Ответ 3

старой теме, но, возможно, полезно для поиска в 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);

Ответ 4

В стандарте С++ 03 нормативная ссылка для стандартной библиотеки C - ISO/IEC 9899: 1990 (C90), которая не включает функцию round. В С++ 11 это ISO/IEC 9899: 1999 (C99), который включает в себя функцию round.

Содержимое <cmath> в каждом стандарте С++ совпадает с math.h из соответствующей стандартной библиотеки C, за исключением нескольких изменений (§26.8/4 в С++ 11):

Содержимое этих заголовков [ <cmath> и <cstdlib>] совпадает с заголовками библиотеки стандартного C <math.h> и <stdlib.h> соответственно [...]

Они, однако, находятся в области пространства имен std (§17.6.1.2/4 в С++ 11):

Однако в стандартной библиотеке С++ декларации (за исключением имен, которые определены как макросы в C) находятся в области пространства имен (3.3.6) пространства имен std.

Итак, чтобы его завершить, функция round недоступна в С++ 03, поэтому скомпилируйте ее с опцией -std=c++0x и обратитесь к ней как std::round.

Ответ 5

как насчет

float myRoundFunc(float toRound)
{
  return std::ceil(toRound - 0.5);
}

Таким образом, нет никакого сравнения, и оно будет округлено должным образом.