typedef Auflösung über Namespaces

8

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?

    
Marcin K 17.02.2011, 22:28
quelle

4 Antworten

11

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.

    
Charles Bailey 17.02.2011, 22:50
quelle
4

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.

    
Peon the Great 17.02.2011 22:33
quelle
1

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.

    
Mark Ransom 17.02.2011 22:37
quelle
0

Es verbirgt nicht den globalen. Deshalb haben Sie die Zweideutigkeit.

    
Marcelo Cantos 17.02.2011 22:33
quelle

Tags und Links