Ich möchte eine Struktur eine Art Alias auf einen anderen Typ für metaprogramming Zwecke enthalten:Darf ich einen Alias für einen Membertyp für einen Typ in einem umgebenden Bereich mit demselben Namen deklarieren?
struct Foo {};
struct WithNestedTypeAlias {
using Foo = Foo;
};
Dann kann ich Sachen wie WithNestedTypeAlias::Foo
in einer Vorlage tun usw.
Wie ich verstehe, ist diese Art alias gültig weil es die Bedeutung des Foo
Typs nicht ändert. Clang kompiliert das glücklich.
jedoch GCC klagt:
test-shadow-alias.cpp:4:20: error: declaration of ‘using Foo = struct Foo’ [-fpermissive]
using Foo = Foo;
^
test-shadow-alias.cpp:1:8: error: changes meaning of ‘Foo’ from ‘struct Foo’ [-fpermissive]
struct Foo {};
^
Jetzt bin ich verwirrt, weil ich ausdrücklich nicht die Bedeutung von Foo
von struct Foo
ändern.
Was ist das richtige Verhalten für C++ 14? Ich weiß, dass ich das umgehen kann, indem ich die struct Foo
umbenenne, aber ich würde gerne verstehen, ob der Fehler von GCC hier richtig ist.
Hinweise:
mit Klirren getestet ++ 3.8 und gcc 5.4, aber Godbolt suggests this hasn't changed in more recent GCC versions.
I bei Interaction between decltype and class member name shadowing an external name sah, wo der Name ein variable entweder auf eine Variable in dem äußeren Umfang oder auf einen Teilnehmer beziehen. Im Gegensatz dazu handelt meine Frage hier von einem Typalias. Es gibt keine Mehrdeutigkeit, da sich
Foo
immer innerhalb des Klassenbereichs auf::Foo
bezieht. Ich sehe nicht, wie die Antwort dort auf mein Problem zutrifft.Dies ist wahrscheinlich auf ein Missverständnis, was Typ-Aliase tatsächlich sind.
Ändern der Anweisung zu 'mit Foo = :: Foo;' behebt es, aber ich kann nicht erklären, warum. –
Ändern zu 'mit Foo = struct Foo;' behebt es auch. Beachten Sie, dass das Äquivalent 'typedef struct Foo Foo;' idiomatischer C-Code ist. – Oktalist