"cycle" n'est pas un membre de 'std'
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?
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
.