enums enum::type oder type
-
Ich habe folgende Frage.
Ich arbeite mit einem Freund an einem Projekt und jetzt kam folgendes Problem auf:
Er benutzt VSC++ und kann den Aufruf enum::typ (also zum beispiel RECHENZEICHEN::PLUS) fehlerfrei compileren, bei einer switch case Anweisung zum Beispiel, ich hingegen bekomme einen Haufen Errors von Netbeans (gcc) wenn ich das compilieren will.
Wieso ist dem so, und was ist jetzt richtiger?
-
Weil MSVC++ diesbezüglich eine Erweiterung anbietet. Im höchsten Warnlevel würde er auch eine Meldung ausgeben.
**
Enum::Konstanteist nicht standardkonform**, wird es meines Wissens aber in C++0x sein. Nimm Namensräume, wenn du die Konstanten gliedern willst.
-
Ich verwende dafür gerne folgende Struktur:
namespace MyEnum { enum Id { First, Second, Last }; }So kann man schön schreiben:
void foo(MyEnum::Id id); MyEnum::Id id = MyEnum::Second;Mit C++0x kann man dann natürlich den namespace weglassen und es gleich richtig machen.
-
enum schrieb:
Ich verwende dafür gerne folgende Struktur:
namespace MyEnum { enum Id { First, Second, Last }; }Gibt es ein Argument gegen
structstattnamespace?
-
TyRoXx schrieb:
Gibt es ein Argument gegen
structstattnamespace?Warum einen Typ nehmen, wenn man nur einen Namensraum braucht?
-
structist auch ein Namensraum, kann aber im Gegensatz zunamespacenicht erweitert werden. Ein versehentliches Wiederverwenden des Namens führt mitstructzu einem Compiler-Fehler. Außerdem ist dem Leser sofort klar, dass der Namensraum nur demenumdient.
-
Dafür kann man
structversehentlich instanziieren oder an Orten einsetzen, wo ein Typ benötigt wird. Es besteht auch die Gefahr, dass der BenutzerMyEnum enumVar;stattMyEnum::Id enumVar;schreibt und der Code trotzdem kompiliert.Semantisch gesehen will man nur einen Namensraum zur Gliederung, daher scheint mir
namespaceam naheliegendsten.
-
Diese "Lösung" kommt wohl eher nicht in Frage:
struct Number { enum Enum { }; private: Number(); Number(const Number &); };Aber vielleicht das hier für mehr Komfort:
typedef Number::Enum NumberId;Außerdem kann man den zusätzlichen
struct-Typ nicht sinnvoll verwenden, ohne Fehler zu erzeugen.