Ich bin derzeit verwirrt mit der Art und Weise, wie "using (namespace)" -Anweisungen in C ++ funktionieren.
Ich habe:
%Vor% Ergebnisse in (paraphrasiert):
Verweis auf 'uint' ist mehrdeutig.
Kandidaten sind
typedef unsigned int uint
und
typedef unsigned int mine :: uint
Inzwischen, wenn ich das tue
%Vor%Alles funktioniert gut. Es erscheint mir seltsam, dass " identifier ;" Ändert die Sichtbarkeit der anderen Typdefinition (verbirgt die globale Definition?). Kann mir jemand zeigen, welche Regeln in C ++ die Auflösung von typedefs über Namespaces hinweg regeln?
Ein Name, der durch eine using-Direktive sichtbar gemacht wird, erscheint im nächsten umschließenden Bereich, der [- direkt oder indirekt -] sowohl die using-Direktive als auch den nominierten Namespace enthält . (7.3.4 [namespace.udir])
Dies bedeutet, dass beide uint
-Deklarationen im globalen Namespace-Bereich angezeigt werden, wenn sie nach der using-Direktive in other
gesucht werden.
Eine using-declaration deklariert, wie jede andere Deklaration, einen Namen in dem Bereich, in dem er angezeigt wird. Aus diesem Grund versteckt using mine::uint;
im zweiten Beispiel den von uint
eingeführten using namespace mine;
, da letzterer aus dem globalen Bereich zu kommen scheint.
Ihr ursprünglicher Code verwirrt den Compiler, weil die Uint entweder
sein kann %Vor%oder
%Vor% daher wirft der Compiler diese Fehlermeldung an Sie. In der "fix", die Verwendung mine::uint
explizit angegeben, dass ::mine::uint
bevorzugt werden soll.
Jedoch sollte typedef
Konflikt IMO vermieden werden. Es macht den Code so schwer zu pflegen.
Ich kann nicht Kapitel und Vers für dich zitieren, aber das macht Sinn für mich. Wenn der Compiler das Symbol% co_de% im aktuellen Namespace nicht finden kann, sucht er nach anderen Namespaces, um zu sehen, ob er das Symbol dort finden kann. Da es in zwei anderen Namespaces gefunden wird, ist es mehrdeutig.
Wenn Sie uint
angegeben haben, haben Sie dieses Symbol in den aktuellen Block importiert, damit es gefunden wird, bevor die anderen Namespaces überprüft werden müssen.
Es verbirgt nicht den globalen. Deshalb haben Sie die Zweideutigkeit.
Tags und Links c++ namespaces typedef