Forum: PC-Programmierung C++ Enumerator


von sven (Gast)


Lesenswert?

Hallo,

wieso geht das nicht in C++?
1
enum e_1 {Hund};
2
enum e_2 {Hund};
3
4
:
5
6
e_1 var1 = e_1::Hund;
7
e_2 var2 = e_2::Hund;

Schon bei der Enum Deklaration gibt der Compiler mir eine Fehlermeldung.
"'Hund': redefinition; previous definition was 'enumerator'"

Selbst untere Schreibweise sollte doch eindeutig auflösbar sein für den 
Compiler.
1
enum e_1 {Hund};
2
enum e_2 {Hund};
3
4
:
5
6
e_1 var1 = Hund;
7
e_2 var2 = Hund;

Ich sage doch mit der Deklaration prinzipiell dem Compiler, die 
Enumeration (Aufzählungstyp) e_1 darf nur all die Werte in der 
geschweiften Klammer annehmen und für die Enumeration e_2 sind eben nur 
die Werte in der geschweiften Klammer hinter e_2 erlaubt.

Weiter unten sage ich dann die Variable var1 vom Typ e_1 hat den Wert 
Hund.
e_1 var1 = Hund;

Wieso bringt mir VS C++ hier diese Fehlermeldung?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Bei normalen "C-enums" sind die Elemente alle global, d.h. im Code 
kannst du einfach nur "Hund" schreiben, und hier gibt es dann eine 
Kollision. Seit C++11 kannst du "enum class e_1 { Hund };" schreiben, 
dann ist es genau so wie von dir gewünscht.

von Dirk K. (merciless)


Lesenswert?

namespace n1 {
  enum e1 {
    Hund
  };
}

namespace n2 {
  enum e2 {
   Hund
  };
}

int main() {
  n1::e1 x = n1::e1::Hund;
  n2::e2 y = n2::e2::Hund;
  if (x == y) printf("Na Holla die Waldfee!");
  return 0;
}

Das baut zumindest. Mir erschliesst sich aber
nicht der Sinn, 2 Konstanten, die miteinander
nichts gemein haben, den gleichen Namen zu geben ;)

merciless

von guest (Gast)


Lesenswert?

Dirk K. schrieb:
> Das baut zumindest. Mir erschliesst sich aber
> nicht der Sinn, 2 Konstanten, die miteinander
> nichts gemein haben, den gleichen Namen zu geben ;)

In größeren Projekten kommt sowas schon mal vor. Dann verpackt man die 
Enums in verschiedene Namespaces (wie Du ja grad gezeigt hast) oder in 
verschiedene Klassen oder nimmt die von Niklas schon erwähnte 'enum 
class' Variante.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.