У меня есть следующий код:
namespace A {
struct Foo {
int a;
};
}
struct Foo {
int b;
};
struct Bar : public A::Foo {
Bar(Foo foo) {
c = foo.b;
}
int c;
};
Компиляторы C ++ жалуются на «c = foo.b», потому что A :: Foo не имеет члена с именем b. Если я изменяю тип параметра Bar с помощью :: Foo, он работает.
Мой вопрос заключается в том, что является рациональным для такого поведения (я полагаю, это связано с тем, что наследование заставляет Bar войти в пространство имен A, но я не могу найти какую-либо документацию, подтверждающую эту теорию.
c++
inheritance
namespaces
language-lawyer
Винсент Ле Лижур
источник
источник
A
, которое вы можете увидеть, если разрешитеBar
наследовать от другой структуры вA
. Тогда нет никакой двусмысленности. Это больше похоже на наследование добавляет все от,A::Foo
вBar
том числе разрешениеFoo
наA::Foo
. Извините, я не могу выразить это более точно.Ответы:
Каждому классу присваивается имя в качестве члена. Так что вы можете назвать
A::Foo::Foo
. Это называется введенным именем класса.Поскольку поиск по имени без аргументов типа аргумента начинается в области действия класса
Bar
, он будет продолжаться в области действия своего базового класса для учета любого члена там. И он найдетA::Foo::Foo
как имя типа.Если вы хотите использовать глобальное имя типа, просто определите его по окружающему (глобальному) пространству имен.
Который выполняет полностью квалифицированный поиск в области, где введенное имя класса не появляется.
Дополнительный вопрос «почему» см.
источник
struct Bar:: A::Foo::Foo::Foo::Foo::Foo {};
но есть контексты, в которыхA::Foo::Foo
указывается конструктор, и поэтому вы не можете продолжать добавлять столько,Foo
сколько хотите. Это похоже (но с совершенно другой механизм) с тем , что вы можете вызвать функциюf
следующим образом:(************f)()
.Не полный ответ, только код, который показывает (поскольку он компилируется),
Bar
но не вводитnamespace A
. Вы можете видеть, что при наследовании отA::Foo1
нет проблем с неоднозначностью,Foo
которая была бы другой, если бы это наследство позволялоBar
войтиA
.источник