Pregunta
Intento compilar este código:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
Pero GCC me dice:
error: 'round' is not a member of 'std'
Sé que he usado el round
funcionar muchas veces en ISOC++98 antes.Extraordinariamente, round
y ::round
ambos trabajan.
¿Lo que da?
Actualizar:estaba compilando con g++ -std=c++98 -Wall -pedantic
.Cambiar a std=c++0x
obras.
¿Pero por qué los no calificados/anónimos round
y ::round
ambos funcionan si std::round
¿no?
Solución
El std::round
Las funciones son C++ 11, por lo que deberá compilar con C++ 11 o un estándar más reciente habilitado.
Otros consejos
Investigué un poco, esto es lo que encontré:
round
se define en ISOC++11, ya que contiene el ISO C99 biblioteca estándar.
round
no es parte del ISOC++98, que utiliza el ISOC90 biblioteca estándar.
Por eso no está en el espacio de nombres. std
para C++98.
Pero g++
está (incorrectamente) incluyendo el C99 encabezados, incluso cuando se compilan con -std=c++98 -pedantic
, que debería desactivar todas las cosas no estándar:
GNU_SOURCE está definido por G++ y...implica _USE_ISOC99
(de http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)
Esta es la razón por ::round
obras.
Aparentemente esto es un error en GCC: ¿Por qué GCC permite el uso de round() en C++ incluso con las banderas ansi y pedante?
Es posible que otros compiladores de C++ no proporcionen una round
función (ya que no es requerida por el estándar), por lo que debería definir la mía propia.
qué tal si
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
De esa forma no habrá comparación y se redondeará correctamente.
Tema antiguo pero quizás útil para quienes 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);
En el estándar C++03, la referencia normativa para el biblioteca C estándar es ISO/IEC 9899:1990 (C90), que no es incluir la round
función.En C++11, es ISO/IEC 9899:1999 (C99), que hace incluir la round
función.
Los contenidos de <cmath>
en cada estándar C++ son los mismos que math.h
de la biblioteca C estándar correspondiente excepto por algunos cambios (§26.8/4 en C++11):
El contenido de estos encabezados [
<cmath>
y<cstdlib>
] son los mismos que los encabezados de la biblioteca C estándar<math.h>
y<stdlib.h>
respectivamente [...]
Sin embargo, están en el alcance del espacio de nombres de std
(§17.6.1.2/4 en C++11):
Sin embargo, en la biblioteca estándar de C++, las declaraciones (excepto los nombres que se definen como macros en C) están dentro del alcance del espacio de nombres (3.3.6) del espacio de nombres std.
Entonces, para terminar, el round
La función no está disponible en C++03, así que compílela con el -std=c++0x
opción y referirse a ella como std::round
.