当使用多重继承时,为什么这个限定名称不明确
When using multiple inheritance, why is this qualified name ambiguous?
我正试图使用Bottom对象访问结构Top中的成员变量x。
代码如下:
#include <cstdio>
struct Top
{
public:
int x = 1;
};
struct Left : public Top
{
int x = 2;
};
struct Right : public Top
{
int x = 3;
};
struct Bottom : public Left, public Right
{
int x = 4;
};
int main()
{
Bottom b;
std::printf("value: %dn", b.Left::Top::x);
return 0;
}
使用gcc 4.8时会出现以下错误:
main.cpp: In function 'int main()':
main.cpp:27:45: error: 'Top' is an ambiguous base of 'Bottom'
std::printf("value: %dn", b.Left::Top::x);
^
这是如何模棱两可的?我如何使用限定名称访问它?
问题是C++没有办法直接表达"多级"类成员的概念,例如"Left
的Top
子对象的成员x
"。Left::Top::x
的意思是"Left::Top
表示的类型中的成员x
",而Left::Top
表示的类型正是Top
。
这就是为什么你可以写一些奇怪的东西,比如
int Left::* ptr = &Right::Top::x;
因为=
的右手边正好等价于&Top::x
,并且指向基类成员的指针可以隐式转换为指向派生类成员的指针。(此转换的结果仍然引用派生类的基类子对象中的成员。)
为了消除歧义,您可以沿着static_cast<Left &>(b).Top::x
的行做一些事情,或者使用指向成员的指针——给定int Left::* ptr = &Top::x;
,b.*ptr
将引用b
的Left
子对象的Top
子对象中的x
。
相关文章:
- Visual C++(VS2017)中用户定义的转换不明确
- 重载类方法的不明确调用
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 获取当前正在运行的 exe 名称(不是路径)
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 对重载函数find_first_not_of的不明确调用
- 不明确的成员模板查找
- gcc出现不明确的模板实例化错误
- 调用'Node'构造函数是不明确的
- 如何解决不明确的运算符过载问题?
- C++ 函数名称不明确
- 如何解决多次继承的不明确变量名称?
- C++中的变量名称不明确
- 当两个超类具有具有相同名称但签名不同的成员函数时,不明确
- 通过不明确的转换运算符进行引用绑定
- 当使用多重继承时,为什么这个限定名称不明确
- C++ 成员函数名称与标准 C 库不明确