2012-10-02 17 views
15

estoy intento compilar este código:'redondo' no es un miembro de 'STD'

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

Pero GCC me está diciendo:

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

Sé que he utilizado el round funciona muchas veces en ISO C++ 98 antes. Inusualmente, round y ::round ambos funcionan.

¿Qué ofrece?

Actualización: Estaba compilando con g++ -std=c++98 -Wall -pedantic. Cambiando a std=c++0x funciona.

¿Pero por qué los no calificados/anónimos round y ::round funcionan si std::round no?

+1

no, no es: http://www.cplusplus.com/reference/clibrary/cmath/ –

+3

http://stackoverflow.com/questions/485525/round-for-float-in-c – Derek

+2

@ HugoCorrá sí lo es, pero solo en C++ 11: http://en.cppreference.com/w/cpp/numeric/math/round – juanchopanza

Respuesta

3

En el estándar C++ 03, la referencia normativa para la biblioteca C estándar es ISO/IEC 9899: 1990 (C90), que no significa incluyen la función de round. En C++ 11, es ISO/IEC 9899: 1999 (C99), que hace incluye la función round.

El contenido de <cmath> en cada estándar de C++ son los mismos que math.h de la biblioteca C estándar correspondiente a excepción de algunos cambios (§26.8/4 en C++ 11):

El contenido de estas cabeceras [<cmath> y <cstdlib>] son ​​los mismos que los encabezados de biblioteca estándar de C <math.h> y <stdlib.h> respectivamente [...]

son, sin embargo, en el ámbito del espacio de nombres de std (§17.6 .1.2/4 en C++ 11):

En el C++ estándar biblioteca, sin embargo, las declaraciones (excepto para los nombres que se definen como macros en C) están dentro de alcance de espacio de nombres (3.3.6) de la namespace std.

lo tanto, para envolverlo, la función round no está disponible en C++ 03, por lo que compilar con la opción -std=c++0x y se refieren a ella como std::round.

+0

Gracias, pero si cmath y math.h son iguales, no explica por qué :: round funciona, pero std :: round no. Estoy compilando con g ++ -std = C++ 98 -Wall -Wextra -pedantic. – QuasarDonkey

+0

Lo probé y tienes razón. Solo puedo imaginar que '' hace '#include ' y los pulls solo en las versiones C90 de las funciones en 'std', dejando todo lo demás en el espacio de nombres global. Las funciones que deberían estar disponibles en 'std', como' sin', sí funcionan como 'std :: sin (90.0)'. –

11

He hecho un poco de investigación, esto es lo que he encontrado:

round se define en ISO C++ 11, ya que contiene la biblioteca estándarISO C99.

round no es parte de la ISO C++ 98, que utiliza el biblioteca estándar ISO C90.

Es por eso que no está en el espacio de nombres std para C++ 98.

Pero es g++ (incorrectamente) que incluye las cabeceras C99, incluso cuando se compila con -std=c++98 -pedantic, que deben desactivar todas las cosas no estándar:

GNU_SOURCE se define por G ++ y ... que implica _USE_ISOC99

(desde http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)

Esta es la razón por ::round obras.

Al parecer, esto es un error en GCC: Why does GCC allow use of round() in C++ even with the ansi and pedantic flags?

Otros compiladores de C++ no pueden proporcionar una función round (ya que no es requerido por la norma), por lo que debe definir mi propia.

+1

No intentes definir tu propia ronda, mira [mi respuesta aquí] (http://stackoverflow.com/a/24348037/1708801) es mucho más difícil de lo que parece. Lamentablemente, toneladas de respuestas a hilos similares hacen exactamente eso y, en su mayoría, incorrectas son formas sutiles. Algunos se ven perjudicados, pero muchos incluso son respuestas aceptadas. –

+1

Esto hilarante. Mi solución para la falta de 'std :: round' en C++ 03 es usar' round' de '' en su lugar y confiar en un error de GCC que _acceso accidental de la función_. De alguna manera este error ni siquiera es heredado por ''. Buen trabajo, C++! –

+0

@PreferenceBean Desde entonces he migrado a C++ 11: 'gcc -std = C++ 11'. Tiene una función 'std :: round', entre otras cosas. – QuasarDonkey

4

viejo tema, pero tal vez útil para los que buscan en 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); 
3

¿qué tal

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

De esa manera no hay comparación y se completará correctamente.

Cuestiones relacionadas