Question

Je vais essayer de compiler ce code:

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

Mais GCC est de me dire:

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

Je sais que j'ai utilisé le round la fonction de nombreuses fois dans ISO C++98 avant de.Exceptionnellement, round et ::round les deux travaux.

Ce qui donne?

Mise à jour:J'ai été la compilation avec g++ -std=c++98 -Wall -pedantic.La commutation de l' std=c++0x des œuvres.

Mais pourquoi les non qualifiés/anonyme round et ::round à la fois le travail si std::round ne l'est pas?

Était-ce utile?

La solution

L' std::round fonctions C++11, donc vous auriez besoin pour compiler du C++11 ou d'une norme plus récente activé.

Autres conseils

J'ai fait un peu de recherche, voici ce que j'ai trouvé:

round est défini dans ISO C++11, car il contient le La norme ISO C99 la bibliothèque standard.

round ne fait pas partie de la ISO C++98, qui utilise le ISO C90 la bibliothèque standard.

C'est pourquoi il n'est pas dans l'espace de noms std pour C++98.

Mais g++ est (à tort), y compris la C99 les en-têtes, même lorsqu'il est compilé avec -std=c++98 -pedantic, qui devrait désactiver tous les non-standard des trucs:

GNU_SOURCE est définie par G++ et ...il implique _USE_ISOC99

(à partir de http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)

C'est pourquoi ::round des œuvres.

Ce qui, apparemment, est un bug de GCC: Pourquoi ne GCC permettre l'utilisation de round() en C++, même avec la norme ansi et pédant drapeaux?

D'autres compilateurs C++ ne peut pas fournir une round fonction (car il n'est pas exigé par la norme), si je devais définir mon propre.

que diriez -

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

De cette façon, il n'y a pas de comparaison et il va s'arrondir correctement.

vieux sujet, mais peut-être utile pour ceux qui sont à la recherche dans 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);

Dans le C++03 standard, la norme de référence pour la bibliothèque standard C la norme ISO/IEC 9899:1990 (C90), qui ne pas inclure l' round fonction.En C++11, c'est la norme ISO/IEC 9899:1999 (C99), qui n' inclure l' round fonction.

Le contenu de <cmath> dans chaque C++ standard sont les mêmes que math.h à partir de la bibliothèque standard C à l'exception de quelques modifications (§26.8/4 en C++11):

Le contenu de ces en-têtes [<cmath> et <cstdlib>] sont les mêmes que la bibliothèque Standard C-têtes <math.h> et <stdlib.h> respectivement [...]

Ils sont, cependant, dans l'espace de noms de la portée de std (§17.6.1.2/4 en C++11):

Dans la norme C++ de la bibliothèque, toutefois, les déclarations (sauf pour les noms qui sont définis comme des macros en C) sont dans l'espace de noms de la portée (3.3.6) de l'espace de noms std.

Alors, pour conclure, que l' round la fonction n'est pas disponible en C++03, compiler avec l' -std=c++0x option et se réfèrent à elle comme std::round.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top