switch Anweisung bei enum funktioniert nicht



  • Ich mache folgendes

    enum VariationType {Delay, Period};
    ...
    VariationType PeriodVariationType;
    ...
    switch (PeriodVariationType)
    {
    	case Period: LinearVariation(); break;
    	case Delay: LinearVariationUsingDelay(); break;
    }
    

    was mir folgende Fehlermeldungen bringt:

    1>.\src\CouplerCalculation.cpp(90) : error C2051: case-Ausdruck ist keine Konstante
    1>.\src\CouplerCalculation.cpp(91) : error C2051: case-Ausdruck ist keine Konstante
    1>.\src\CouplerCalculation.cpp(92) : warning C4060: switch-Anweisung enthält weder 'case'- noch 'default'-Marken

    Warum?
    EDIT:
    Period ist auch anderweitig als struct definiert. Mache ich nun folgendes

    switch (PeriodVariationType)
    {
    	case VariationType::Period: LinearVariation(); break;
    	case VariationType::Delay: LinearVariationUsingDelay(); break;
    }
    

    kompiliert es zwar, liefert mir aber folgende Warnungen (VS 2005)

    1>.\src\CouplerCalculation.cpp(90) : warning C4482: Nicht dem Standard entsprechende Erweiterung: Enumeration "VariationType" wird im qualifizierten Namen verwendet.
    1>.\src\CouplerCalculation.cpp(91) : warning C4482: Nicht dem Standard entsprechende Erweiterung: Enumeration "VariationType" wird im qualifizierten Namen verwendet.

    Matthias



  • Wo ist der/die/das enum definiert? Im Header?



  • Du hast das Problem doch schon erkannt: Period ist eine Struktur, der stärker wiegt als der Name einer Konstante. Warum es mit der Qualifizierung nicht geht, steht in der Fehlermeldung.

    Du musst die Konstanten umbenennen, oder evtl. einen Trick nutzen, um doch qualifizieren zu können:

    namespace VariationType {
        enum VariationType_t {
            Delay,
            Period
        };
    }
    using VariationType::VariationType_t;
    

    Dann heißt die Enum zwar VariationType_t, Du kannst die Konstanten aber mit VariationType::Period ansprechen.



  • LordJaxom schrieb:

    Du hast das Problem doch schon erkannt: Period ist eine Struktur, der stärker wiegt als der Name einer Konstante. Warum es mit der Qualifizierung nicht geht, steht in der Fehlermeldung.

    Schon klar, aber kann mir auch einer erklären warum der C++ Standard etwas so eindeutiges (aus meiner Sicht) verbietet?



  • pospiech schrieb:

    Schon klar, aber kann mir auch einer erklären warum der C++ Standard etwas so eindeutiges (aus meiner Sicht) verbietet?

    Eindeutig ist das erst, seit es Sprachen gibt, die das so handhaben. C++ (und C auch) hat schon vorher Enum-Konstanten direkt in den umliegenden Namensraum injiziert.

    Ich würde naiverweise "weil man es nicht besser wusste" als Antwort annehmen. Aber vielleicht weiß da ja jemand noch genaueres. In C++0x wird es übrigens auch qualifizierte enums geben, so dass ich annehmen würde, man hat diese Tatsache inzwischen selbst als verbesserungswürdig erkannt.


  • Mod

    LordJaxom schrieb:

    Du hast das Problem doch schon erkannt: Period ist eine Struktur, der stärker wiegt als der Name einer Konstante.

    Seit wann (tatsächlich ist es ja genau umgekehrt: der Name eines UDTs kann durch ein Objekt, eine Funktion oder eine Aufzählungskonstante im gleichen Scope verdeckt werden). Ohne ein bisschen mehr Code (alle relevanten Deklarationen als auch die Scopes, in denen sie erfolgen) kann man hier nur raten.



  • Richtig, das habe ich verwechselt.

    Es könnte also noch eine Variable oder ein UDT im "weiter innenliegenden" (gibt's dafür einen Fachbegriff?) Scope sein.


Anmelden zum Antworten