„round“ ist kein Mitglied von „std“
Frage
Ich versuche, diesen Code zu kompilieren:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
Aber GCC sagt mir:
error: 'round' is not a member of 'std'
Ich weiß, dass ich das verwendet habe round
viele Male funktionieren ISO C++98 Vor.Ungewöhnlich, round
Und ::round
beide arbeiten.
Was gibt?
Aktualisieren:Ich habe mit kompiliert g++ -std=c++98 -Wall -pedantic
.Wechseln zu std=c++0x
funktioniert.
Aber warum tun die Unqualifizierten/Anonymen round
Und ::round
beide funktionieren, wenn std::round
nicht?
Lösung
Der std::round
Funktionen sind C++11, Sie müssten also mit C++11 oder einem neueren Standard kompilieren.
Andere Tipps
Ich habe ein wenig recherchiert und Folgendes herausgefunden:
round
ist definiert in ISO C++11, da es die enthält ISO C99 Standardbibliothek.
round
gehört nicht dazu ISO C++98, das die verwendet ISO C90 Standardbibliothek.
Deshalb liegt es nicht im Namespace std
für C++98.
Aber g++
ist (fälschlicherweise) einschließlich der C99 Header, auch wenn sie mit kompiliert wurden -std=c++98 -pedantic
, was alle nicht standardmäßigen Dinge deaktivieren sollte:
GNU_SOURCE wird durch G++ definiert und ...es impliziert _USE_ISOC99
(aus http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)
Deshalb ::round
funktioniert.
Dies ist offenbar ein Fehler in GCC: Warum erlaubt GCC die Verwendung von „round()“ in C++ auch mit den Flags „ansi“ und „pedantic“?
Andere C++-Compiler bieten möglicherweise keine round
Funktion (da sie vom Standard nicht gefordert wird), also sollte ich meine eigene definieren.
wie wäre es mit
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
Auf diese Weise gibt es keinen Vergleich und es wird richtig gerundet.
altes Thema, aber vielleicht nützlich für diejenigen, die in Google suchen:
//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);
Im C++03-Standard ist die normative Referenz für Standard-C-Bibliothek ist ISO/IEC 9899:1990 (C90). nicht umfassen die round
Funktion.In C++11 ist es ISO/IEC 9899:1999 (C99). tut umfassen die round
Funktion.
Die Inhalte von <cmath>
in jedem C++-Standard sind die gleichen wie math.h
aus der entsprechenden Standard-C-Bibliothek mit Ausnahme einiger Änderungen (§26.8/4 in C++11):
Der Inhalt dieser Header [
<cmath>
Und<cstdlib>
] sind mit den Headern der Standard-C-Bibliothek identisch<math.h>
Und<stdlib.h>
jeweils [...]
Sie liegen jedoch im Namensraumbereich von std
(§17.6.1.2/4 in C++11):
In der C++-Standardbibliothek liegen die Deklarationen (mit Ausnahme von Namen, die in C als Makros definiert sind) jedoch im Namespace-Gültigkeitsbereich (3.3.6) des Namespace std.
Also, um es zusammenzufassen, die round
Die Funktion ist in C++03 nicht verfügbar. Kompilieren Sie sie daher mit der -std=c++0x
Option und bezeichnen Sie sie als std::round
.