【发布时间】:2020-03-24 07:56:26
【问题描述】:
我有以下代码:
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 的成员。 如果我使用 ::Foo 更改 Bar 参数的类型,它会起作用。
我的问题是这种行为背后的原因是什么(我想这与继承使 Bar 进入 A 命名空间这一事实有关,但我找不到任何文档来支持这一理论。
【问题讨论】:
-
我认为它与参数相关的查找相关。我已将“语言律师”标记为“语言律师”,因为我认为您正在寻找参考语言标准的答案。第一个问题非常好!让这一切都值得。
-
它没有进入命名空间
A,如果你让Bar继承A中的另一个结构,你可以看到。那么就没有歧义了。它更像是继承添加了从A::Foo到Bar的所有内容,包括Foo到A::Foo的分辨率。抱歉,我真的无法更准确地表达。 -
@Bathsheba 你的意思是在模板中查找函数名称(或函数模板名称)或依赖名称的参数类型依赖名称查找吗?
标签: c++ inheritance namespaces language-lawyer