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::Konstante ist 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 struct statt namespace ?



  • TyRoXx schrieb:

    Gibt es ein Argument gegen struct statt namespace ?

    Warum einen Typ nehmen, wenn man nur einen Namensraum braucht?



  • struct ist auch ein Namensraum, kann aber im Gegensatz zu namespace nicht erweitert werden. Ein versehentliches Wiederverwenden des Namens führt mit struct zu einem Compiler-Fehler. Außerdem ist dem Leser sofort klar, dass der Namensraum nur dem enum dient.



  • Dafür kann man struct versehentlich instanziieren oder an Orten einsetzen, wo ein Typ benötigt wird. Es besteht auch die Gefahr, dass der Benutzer MyEnum enumVar; statt MyEnum::Id enumVar; schreibt und der Code trotzdem kompiliert.

    Semantisch gesehen will man nur einen Namensraum zur Gliederung, daher scheint mir namespace am 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.


Anmelden zum Antworten