Domanda
Provo a compilare questo codice:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
Ma GCC mi sta dicendo:
error: 'round' is not a member of 'std'
So di aver usato il round
funzionare molte volte in ISOC++98 Prima.insolitamente, round
E ::round
funzionano entrambi.
Cosa dà?
Aggiornamento:Stavo compilando con g++ -std=c++98 -Wall -pedantic
.Passando a std=c++0x
lavori.
Ma perché fare il non qualificato/anonimo round
E ::round
entrambi funzionano se std::round
no?
Soluzione
IL std::round
le funzioni sono C++11, quindi dovresti compilare con C++11 o uno standard più recente abilitato.
Altri suggerimenti
Ho fatto un po' di ricerche, ecco cosa ho trovato:
round
è definito in ISOC++11, poiché contiene il ISOC99 libreria standard.
round
non fa parte del ISOC++98, che utilizza il ISOC90 libreria standard.
Ecco perché non è nello spazio dei nomi std
per C++98.
Ma g++
include (erroneamente) il file C99 intestazioni, anche se compilate con -std=c++98 -pedantic
, che dovrebbe disabilitare tutte le cose non standard:
GNU_SOURCE è definito da G++ e...implica _USE_ISOC99
(da http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)
Ecco perché ::round
lavori.
Apparentemente questo è un bug in GCC: Perché GCC consente l'uso di round() in C++ anche con i flag ansi e pedantic?
Altri compilatori C++ potrebbero non fornire a round
funzione (poiché non è richiesta dallo standard), quindi dovrei definirne una mia.
che ne dite di
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
In questo modo non c'è confronto e verrà arrotondato correttamente.
topic vecchio ma forse utile per chi cerca su 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);
Nello standard C++03, il riferimento normativo per il libreria C standard è ISO/IEC 9899:1990 (C90), che non includere il round
funzione.In C++11 è ISO/IEC 9899:1999 (C99), che fa includere il round
funzione.
Il contenuto di <cmath>
in ogni standard C++ sono gli stessi di math.h
dalla corrispondente libreria C standard tranne alcune modifiche (§26.8/4 in C++11):
Il contenuto di queste intestazioni [
<cmath>
E<cstdlib>
] sono gli stessi degli header della libreria C standard<math.h>
E<stdlib.h>
rispettivamente […]
Rientrano, tuttavia, nell'ambito dello spazio dei nomi std
(§17.6.1.2/4 in C++11):
Nella libreria standard C++, tuttavia, le dichiarazioni (ad eccezione dei nomi che sono definiti come macro in C) rientrano nell'ambito del namespace (3.3.6) del namespace std.
Quindi, per concludere, il round
la funzione non è disponibile in C++03, quindi compila con -std=c++0x
opzione e fare riferimento ad essa come std::round
.