class A { public: int a; };
class B : public virtual A { public: using A::a; };
class C : public virtual A { public: using A::a; };
class D : public C, public B { };
class W { public: int w; };
class X : public virtual W { public: using W::w; };
class Y : public virtual W { };
class Z : public Y, public X { };
int main(){
D d;
d.a = 0; // Error
Z z;
z.w = 0; // Correct
return 0;
}
类声明(A
,B
,C
和D
)和第二(W
,X
,Y
和Z
)的第一组被类似地建立不同的是class C
具有使用声明(using A::a
)和class Y
没有。歧义在C++成员名的查找和访问声明
当试图访问a
d.a = 0
时,在Clang(error: member 'a' found in multiple base classes of different types
)和GCC(error: request for member 'a' is ambiguous
)中出现错误。我检查了两个编译器的最新版本和旧版本,并且他们都同意。但是,在z.w = 0
中访问w
已成功编译。
访问a
时出现这种模糊不清的原因是什么?
据我所知,类B
和C
中的访问声明都指向相同的基类成员。顺便说一下,如果我删除它们,则测试编译成功,因为a
已经公开访问(public
访问说明符)。
在此先感谢。
注意:上面的代码是从SolidSands'SuperTest套件稍作修改的测试。
'd.a'有d.B ::了'和'特区::了'(即使在现实中,也有相同)之间'选择。 – Jarod42
为什么不使用'd.A :: a = 0;'? –
我不能在[cppreference]找到(http://en.cppreference.com/w/cpp/)此处适用using'的'任何文件(仅别名,命名空间有关的用途)。 – Walter