Tengo el siguiente código:
namespace A {
struct Foo {
int a;
};
}
struct Foo {
int b;
};
struct Bar : public A::Foo {
Bar(Foo foo) {
c = foo.b;
}
int c;
};
Los compiladores de C ++ se quejan en "c = foo.b" porque A :: Foo no tiene un miembro llamado b. Si cambio el tipo de parámetro Bar con :: Foo, funciona.
Mi pregunta es cuál es la razón detrás de este comportamiento (supongo que tiene que ver con el hecho de que la herencia hace que Bar ingrese el espacio de nombres A, pero no puedo encontrar ninguna documentación que respalde esta teoría.
c++
inheritance
namespaces
language-lawyer
Vincent Le Ligeour
fuente
fuente
A
, que puede ver si dejaBar
heredar de otra estructuraA
. Entonces no hay ambigüedad. Se parece más a la herencia se suma todo, desdeA::Foo
queBar
incluyendo la resolución deFoo
aA::Foo
. Lo siento, realmente no puedo expresarlo con más precisión.Respuestas:
Cada clase tiene su nombre inyectado como miembro. Entonces puedes nombrar
A::Foo::Foo
. Esto se llama el nombre de la clase inyectada.Debido a que la búsqueda de nombre no calificado del tipo de argumento comienza en el alcance de la clase
Bar
, continuará en el alcance de su clase base para dar cuenta de cualquier miembro allí. Y lo encontraráA::Foo::Foo
como un nombre de tipo.Si desea utilizar el nombre de tipo global, simplemente califíquelo por su espacio de nombres (global) circundante.
Lo que está haciendo una búsqueda totalmente calificada en un ámbito donde el nombre de la clase inyectada no aparece.
Para una pregunta complementaria de "por qué", vea
fuente
struct Bar:: A::Foo::Foo::Foo::Foo::Foo {};
pero hay contextos donde seA::Foo::Foo
designa al constructor y, por lo tanto, no puede continuar agregando tantosFoo
como desee. Esto es similar (pero con un mecanismo completamente diferente) al hecho de que se puede llamar a una funciónf
de esta manera:(************f)()
.No es una respuesta completa, solo código que muestra (ya que compila) que
Bar
no ingresa elnamespace A
. Puede ver que al heredar deA::Foo1
allí no hay ningún problema con la ambigüedad,Foo
que sería diferente si esta herencia dejaraBar
entrarA
.fuente