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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top