Mam następujący kod:
namespace A {
struct Foo {
int a;
};
}
struct Foo {
int b;
};
struct Bar : public A::Foo {
Bar(Foo foo) {
c = foo.b;
}
int c;
};
Kompilatory C ++ narzekają na „c = foo.b”, ponieważ A :: Foo nie ma członka o nazwie b. Jeśli zmienię typ parametru Bar za pomocą :: Foo to działa.
Moje pytanie brzmi, jakie jest racjonalne uzasadnienie tego zachowania (przypuszczam, że ma to związek z faktem, że dziedzictwo powoduje, że Bar wchodzi w przestrzeń nazw A, ale nie mogę znaleźć żadnej dokumentacji na poparcie tej teorii.
c++
inheritance
namespaces
language-lawyer
Vincent Le Ligeour
źródło
źródło
A
, którą możesz zobaczyć, jeśli pozwoliszBar
odziedziczyć po innej strukturzeA
. Wtedy nie ma dwuznaczności. To jest bardziej jak dziedziczenie dodaje wszystko odA::Foo
doBar
włącznie z rozdzielczościąFoo
doA::Foo
. Przepraszam, nie potrafię tego dokładniej wyrazić.Odpowiedzi:
Każda klasa ma swoją nazwę wstrzykniętą jako członek. Więc możesz nazwać
A::Foo::Foo
. Nazywa się to nazwą klasy wstrzykniętej.Ponieważ wyszukiwanie typu niekwalifikowanego typu argumentu rozpoczyna się w zakresie klasy
Bar
, będzie kontynuowane w zakresie jego klasy podstawowej, aby uwzględnić dowolnego członka. I znajdzieA::Foo::Foo
jako nazwę typu.Jeśli chcesz użyć globalnej nazwy typu, po prostu określ ją według otaczającej (globalnej) przestrzeni nazw.
Który wykonuje pełne wyszukiwanie w zakresie, w którym nazwa wstrzykniętej klasy nie pojawia się.
Aby uzyskać dalsze pytanie „dlaczego”, zobacz
źródło
struct Bar:: A::Foo::Foo::Foo::Foo::Foo {};
ale istnieją konteksty, w którychA::Foo::Foo
wyznacza konstruktora, a zatem nie można dodawać tyle,Foo
ile chcesz. Jest to podobne (ale z zupełnie innego mechanizmu) z tym, że można wywołać funkcjęf
w następujący sposób:(************f)()
.Nie jest to kompletna odpowiedź, tylko kod pokazujący (ponieważ się kompiluje),
Bar
który nie wchodzi donamespace A
. Widać, że podczas dziedziczeniaA::Foo1
nie ma problemu z dwuznacznością,Foo
która byłaby inna, gdyby to dziedziczenie pozwalałoBar
wejśćA
.źródło