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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top