Enum-Schreibweisen
-
Hi allerseits!
Ich habe enums immer folgendermaßen benutzt:
class Foo { public: enum Bar { Bazz }; void f(Bar bar) { cout << bar; } }; int main() { Foo foo; foo.f(Foo::Bar::Bazz); }Nun wurde mir gesagt, das sei nicht Standardkonform und der Compiler dürfe sowas garnicht compilieren. Nur das folgende sei zulässig:
int main() { Foo foo; foo.f(Foo::Bazz); }Ist erster Aufruf (bzw. die Qualifikation des Enum-Wertes mit dem Namen seiner enum) tatsächlich unzulässig?
-
Jordy schrieb:
... int main() { Foo foo; foo.f(Foo::Bar::Bazz); }Nun wurde mir gesagt, das sei nicht Standardkonform und der Compiler dürfe sowas garnicht compilieren.
Es gibt zwar einige Compiler, die das akzeptieren,
lt Standard ist das jedoch NICHT gueltig.- georg
-
GeorgV schrieb:
Jordy schrieb:
... int main() { Foo foo; foo.f(Foo::Bar::Bazz); }Nun wurde mir gesagt, das sei nicht Standardkonform und der Compiler dürfe sowas garnicht compilieren.
Es gibt zwar einige Compiler, die das akzeptieren,
lt Standard ist das jedoch NICHT gueltig.Was daran liegt, dass eine enum keinen eigenen Scope erzeugt, stattdessen wandern die Namen der in einer enum deklarierten Werte in den drüberliegenden Scope.
Erkennt man auch daran:enum Foo { bar }; enum WoGibtsBier { bar };Ein konformer Compiler wird sich hier beschweren, da es keine zwei bars in einem Scope geben darf.
-
Daß eine Enum in den darüber liegenden Scope rutscht, war ja früher immer so, das war klar. Ich hatte halt den Verdacht, das sich im neueren C++ Standard diesbezüglich etwas geändet haben könnte, weil VC++ die unerblaubte Schreibweise mitmacht.
Danke nochmal!
-
Welcher VC? Mein MSVC7.1 prangert das an.
-
Artchi schrieb:
Welcher VC? Mein MSVC7.1 prangert das an.
Ups ?!
Meiner machts klaglos mit. Auch 7.1
Bekommst du eine Warnung oder einen fehler?
-
Einen Compileerror natürlich. Ich habe jetzt nicht genau dein Beispiel ausprobiert, aber vor wenigen Wochen hatte ich genau an der gleichen Sache geknabbert, weil er einfach nicht wollte.
-
Dann bin ich schlicht ratlos. Wäre schön wenn ich erreichen könnte, daß ich einen Error bekomme. Dann wäre es nämlich einfacher, meinen Code zu bereinigen.
-
Werde dein Beispiel mal heute abend zu Hause ausprobieren.
-
Jordy schrieb:
Dann bin ich schlicht ratlos. Wäre schön wenn ich erreichen könnte, daß ich einen Error bekomme. Dann wäre es nämlich einfacher, meinen Code zu bereinigen.
wenn ich mich recht erinnere dann akzeptiert vc 7.1 solchen code und vc 8 bringt eine warning - defaultmaessig.
probier mal die compileroption /Za aus.
die deaktiviert die ms language extensions, dann muesste der code eigentl rejected werden.aber achtung, wenn du windows header verwendest, dann kannst du diese option gleich wieder vergessen. denn diese header haben nicht wirklich viel mit standardkonformen c++ zu tun...
- georg.
-
OK, habe es jetzt mal ausprobiert. Das erste Beispiel in diesem Thread funktioniert tatsächlich.
Habe aber mal folgendes ausprobiert, was auch das Szenario war, wo ich meinte, das ich es kürzlich auch hatte. Ist nicht ganz gleich, aber ähnlich:
#include <iostream> namespace X { enum Bar { Bazz }; class Foo { public: void f(Bar bar) { std::cout << bar; } }; } int main() { X::Foo foo; foo.f(X::Bar::Bazz); }Anstatt im Class-Scope ist MSVC7.1 bei Namespace-Scopes standardkonform. Denke ich jetzt mal, das es equivalent zum class-Scope laufen sollte?
Jedenfalls bekommt ich bei dem Beispiel folgendes:
test.cpp(24) : error C2039: 'Bazz': Ist kein Element von 'X::Bar'
test.cpp(6): Siehe Deklaration von 'X::Bar'
test.cpp(24) : error C2065: 'Bazz': nichtdeklarierter BezeichnerWenn ich
foo.f(X::Bazz);funktioniert es.