Warum nicht static const Schwimmern erlaubt?
Habe ich eine Klasse, die ist im Grunde nur enthält eine Reihe von Konstanten-Definitionen verwendet, die durch meine Anwendung. Aus irgendeinem Grund obwohl, long
s kompilieren aber float
s nicht:
class MY_CONSTS
{
public :
static const long LONG_CONST = 1; //Compiles
static const float FLOAT_CONST = 0.001f; //C2864
};
Gibt die folgende Fehlermeldung:
1>c:\projects\myproject\Constant_definitions.h(71) : error C2864: 'MY_CONSTS::FLOAT_CONST' : only static const integral data members can be initialized within a class
Bin ich etwas fehlt?
möglich, Duplikat der Warum kann ich nicht ein nicht-integral-static const member in einer Klasse?
InformationsquelleAutor Jon Cage | 2010-03-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die eigentliche Frage zu beantworten, die Sie gefragt: "da die Norm so sagt".
Nur Variablen des statischen, Konstanten, integral Arten (einschließlich der Enumerationen) können initialisiert werden innerhalb einer Klasse Erklärung. Wenn ein compiler unterstützt in-line-Initialisierung der Schwimmer, es ist eine Erweiterung. Wie andere darauf hingewiesen, dass der Umgang mit statischen, konstant, nicht-ganzzahligen Variablen definieren und initialisieren Sie Sie in der Klasse die entsprechende source-Datei (nicht die überschrift).
C++ - Standard Abschnitt 9.2 "Schüler", Punkt 4:
Abschnitt 9.4.2 "Statische Daten-Member" item 2:
Ein weiterer guter Weg wäre, um eine Funktion zurückgeben, die Wert. Der Vorteil ist, dass der Wert sichtbar ist für den compiler (die inline-Funktion). Ein in-.cpp definition wird nicht setzen Sie den Wert auf andere TUs.
Es ist ein weiterer Vorteil der Funktion Ansatz: vermeiden Sie die "static initialization order fiasco", die passieren können, wenn Sie versuchen zu initialisieren statische Werte mit anderen statischen Werte aus anderen compilation-units (obwohl dies wahrscheinlich nicht passieren, mit built-in Typen wie z.B. float).
Und in c++0x-Sie können erklären, den Rückgabetyp-wie
constexpr float
[en.wikipedia.org/wiki/...InformationsquelleAutor Tyler McHenry
Sollten Sie initialisieren Sie in den Körper eines Ihrer cpp-Dateien:
LONG_CONST
:const long MY_CONSTS::LONG_CONST;
Beachten Sie, dass Sie nicht wiederholen Sie die Initialisierung hier.der Unterschied ist, dass diese Compiler sind gebrochen.
Was? Inline-Initialisierung von static-member nicht entfernen Sie die Notwendigkeit für eine definition.
InformationsquelleAutor Will
Sehen Stroustrup ' s Erklärung. Relevantes Zitat:
long
initialisiert werden und einfloat
nicht? Vermutlich einlong
braucht nicht 'im Speicher gespeichert, wie [ein Objekt]', sondern einfloat
? Wie macht das Sinn?lange, konstant gemacht werden kann, einen Teil der CPU-Instruktion (zumindest bei Intel CPUs). Ein float kann nicht helfen, in Erinnerung. Mit leichtem Missbrauch der notation, man kann sagen, lange kann ' s sein, inlined, und schwimmt nicht.
InformationsquelleAutor JRL
Begründung unter den standard-Formulierungen, die andere gegeben haben, ist das gleiche für die template-Argumente können nicht werden floating-point-Zahl. Um konsistentes Ergebnis müssen Sie den compiler implementieren den gleichen Maßstäben wie die einer erfolgt zur compile-Zeit, und das kann kompliziert werden für den cross-compiler und in dem Fall, wo das Programm spielt mit der Rundung-Modus.
Aus dem Speicher, C++0X, der Begriff der Konstante Ausdruck erweitert wurde, und so würde der code gültig sein (aber es ist nicht näher in der Folge von Gleitkomma-Konstanten-Ausdrücke sind die gleichen, wenn der zur Laufzeit ausgewertet oder zur compile-Zeit).
InformationsquelleAutor AProgrammer
was:
(obwohl, ich kann nicht geben eine Erklärung für diesen speziellen Fall...)
InformationsquelleAutor Adrien Plisson
Vom standard 9.4.2/4
Und 5.19/1:
InformationsquelleAutor Andreas Brinck