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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top