Frage

Ich verwende den vollständig qualifizierten Namen der Aufzählung innerhalb einer Methode in einer meiner Klassen.Aber ich erhalte eine Compiler-Warnung, die besagt „Warnung C4482:Nicht standardmäßige Erweiterung verwendet:Enum 'Foo' im qualifizierten Namen verwendet".Müssen wir in C++ Aufzählungen ohne den qualifizierten Namen verwenden?Aber meiner Meinung nach sieht das hässlich aus.

Irgendwelche Gedanken?

War es hilfreich?

Lösung

Ja, Enums erstellen keinen neuen "Namespace", die Werte im Enum sind direkt im umgebenden Bereich erhältlich. Also bekommst du:

enum sample {
  SAMPLE_ONE = 1,
  SAMPLE_TWO = 2
};

int main() {
  std::cout << "one = " << SAMPLE_ONE << std::endl;
  return 0;
}

Andere Tipps

Um es sauber zu machen, ersetzen Sie:

enum Fruit {

    ORANGE = 0,
    BANANA = 1

};

mit

namespace Fruit {

    enum { //no enum name needed

        ORANGE = 0,
        BANANA = 1

    };

};

...

int f = Fruit::BANANA; //No warning

Während etw die Frage beantwortet, wurde nicht darauf eingegangen, wie ich immer Aufzählungen verwendet habe.Auch wenn es mehr oder weniger nur Namen für Zahlen sind, habe ich sie immer verwendet, um Typen zu definieren, die nur bestimmte Werte haben können.

Wenn die Aufzählung Teil der Klasse ist, hilft dies Verbrauchern dabei, eine Aufzählungsreferenz eindeutig zu identifizieren:

class Apple {
  enum Variety {
    Gala,
    GoldenDelicious,
    GrannySmith,
    Fuji
  }
  ...
};

Dann könnten Verbraucher Instanzen der Enumeration deklarieren, als Parameter übergeben und sie qualifizieren, wenn sie auf einen der Typen verweisen.

unsigned int GetCountOfApples( Apple::Variety appleVariety );
...
fujiCnt = GetCountOfApples( Apple::Fuji );

Manchmal möchten Sie eine Aufzählung außerhalb einer Klasse oder zwei Aufzählungen in derselben Klasse, und Sie können so etwas wie das tun, was Poy hatte.Sie können jedoch nicht auf den Enum-Typ verweisen, also benennen Sie ihn einfach.

namespace Color {
  enum ColorEnum {
    Blue,
    Red,
    Black
  };

Die Verwendung der Enumeration und der Werte würde nun wie folgt funktionieren:

Color::ColorEnum firstColor = Color::Blue;
Color::ColorEnum secondColor = Color::Red;

if( firstColor == secondColor )
....

Wenn nun verschiedene Enumerationen mit demselben Namen vorhanden sind, werden diese immer mit ihrem Typ qualifiziert.Dann könnten Sie damit umgehen, wonach der Spieler fragt.

BananaColorEnum banCol = BananaColor::Yellow;
TomatoColorEnum tomCol = TomatoColor::Yellow;

Ja. Konzeptionell Enum definiert einen Typ und die möglichen Werte dieses Typs. Obwohl es natürlich erscheint, zu definieren enum foo { bar, baz }; und beziehen sich dann auf foo::baz ist der gleiche wie int::1.


namespace Company
{
    typedef int Value;
    enum
    {
        Microsoft= 0,
        APPLE = 1, 
    };
};

namespace Fruit
{
    typedef int Value;
    enum
    {
        ORANGE = 0,
        BANANA = 1,
        APPLE = 2, 
    };
};

...

Fruit::Value f = Fruit::BANANA; //No warning
Company::Value f = Company::APPLE; //is different value then Fruit::APPLE

Dies funktioniert auf GCC und MS Compiler und Mac. Der Vorteil ist, dass Sie den Namespace -Operator verwenden und Konflikte bestehen können. Der kleine Nachteil ist, dass man anstelle von Obst Frucht schreiben muss :: Wert. Es ist in großem Projekt nützlicher, wenn Sie nicht wissen, welche Enums in einer anderen Klasse sind.

Wenn es möglich ist, C ++ 11 stattdessen zu verwenden, ist es viel einfacher, da die enum :: Namespace -Syntax möglich ist.

Der sauberste Weg, den ich dazu gefunden habe

namespace Samples
{
    enum Value
    {
        Sample1,
        Sample2,
        Sample3
    };
}
typedef Samples::Value Sample;

In Funktions- und Variablendefinitionen können Sie dann die Typedef verwenden:

void Function(Sample eSample);
Sample m_eSample;

In Ihrer .cpp -Datei können Sie den Namespace verwenden, um Variablen zuzuweisen:

void Function(Sample eSample)
{
    m_eSample = Samples::Sample1;
    eSample = Samples::Sample2;
}

Persönlich denke ich, dass dies ein Compiler -Fehler ist. Ich benutze C ++ für viel Zeit. Leider kein Beispielcode in OP. Die Interpretation einer Aufzählung durch die Java -Leute war tatsächlich korrekt IMO. Meins war so ...

class Foo {
    enum tMyEnum { eFirstVal = 0, eSecondVal = 1};
    // ...
    tMyEnum m_myVal;
};
void Foo::MyMethod() {
    if(m_myVal == tMyEnum::eFirstVal) {
//  ...
    }
}

Ich habe es auch versucht, Foo :: tmyenum :: efirstval. Ohne die Qualifikation wurde alles zusammengestellt.

Ich hatte das gleiche Problem und ich benutze C ++ 11 noch nicht. Ich bevorzuge auch selbst voll qualifizierte Namespaces selbst.

Ich habe diese besondere Warnung deaktiviert. Ich bin sicher, die Leute werden die Idee nicht mögen, aber einige mögen dankbar sein.

#pragma warning( disable : 4482 )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top