4 Stimmen

Verwendung von Klassen und Namensraumunterschieden/Ambiguitäten

Ich frage mich nur, warum es so entworfen ist, dass eine Direktive verwendet wird. 1) Wird eine Struktur wie ein Namensraum behandelt und 2) wird sie nicht:

struct foo
{
  using type0 = int;
};

namespace bar
{
  using type1 = int;
}

using bar::type1; 
using type0 = foo::type0; // 1)
using foo::type0;         // 2)

clang Version 3.3 (Zweig/release_33 186829)
clang -std=c++11 test.cpp
test.cpp:13:12: Fehler: Die Verwendungserklärung kann nicht auf ein Klassenmember verweisen
using foo::type0;

\~^

gcc Version 4.8.1
c++ -std=c++11 test.cpp
test.cpp:13:12: Fehler: ‘foo’ ist kein Namensraum
using foo::type0;

11voto

Nicol Bolas Punkte 409659

Klassen sind keine Namensräume; sie haben einen strikten Geltungsbereich. Der Name eines Klassenmitglieds (wenn außerhalb der Klasse zugegriffen wird) muss immer durch den Klassennamen vorangestellt werden.

using darf das nicht ändern.

Der Grund, warum #1 funktioniert, liegt darin, dass Sie einen Typ-Alias für den in der Klasse deklarierten Typ erstellen. Das ist genau das, was using name = typename; macht. In diesem Fall unterscheidet es sich nicht von einem typedef.

2 erstellt keinen Alias; diese Syntax erwartet, dass ein Name innerhalb eines Namensraums angegeben wird, um ihn in den aktuellen Namensraum zu bringen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X