超多重非虚拟继承中基 class 的作用域运算符
Scope operator for base class in super multiple non-virtual inheritance
考虑这个(完全没有意义,但完全有效)class 继承:
struct Area { int size; };
struct Pattern { int size; };
struct R : Area, Pattern {};
struct C : Area, Pattern {};
struct X: R , C {};
让我们看一下这个伟大的层次结构的图表:
Area Pattern
|\ /|
| \/ |
| /\ |
|/ \|
R C
\ /
\/
X
现在,如果我没记错的话,X 应该有 4 size
个成员。
如何使用范围运算符引用它们?
显而易见的解决方案不起作用:
X x;
x.R::Area::size = 24;
clang 错误:
23 : <source>:23:3: error: ambiguous conversion from derived class 'X' to base class 'Area':
struct X -> struct R -> struct Area
struct X -> struct C -> struct Area
x.R::Area::size = 8;
^
1 error generated.
gcc 错误:
<source>: In function 'auto test()':
23 : <source>:23:14: error: 'Area' is an ambiguous base of 'X'
x.R::Area::size = 8;
^~~~
一些非常需要的说明:
我是瞎编的,不是真的设计
- 所以请不要指出设计上的问题
- 请不要认为这是一个好的设计。它是...不是 - 至少可以这么说
这完全是关于 C++ 语法 来解决歧义的。
- 请不要建议不要做
- 请不要建议虚拟继承。
类似于static_cast<R&>(x).Area::size = 8;
这应该是丑陋的:)
为了阐明为什么原始代码不起作用,值得一提的是,合格的 id 具有以下形式(除其他外)type-name::id
所以 x.R::Area::y
等同于 using T = R::Area; x.T::y;
就消除歧义而言,显然没有帮助。
考虑这个(完全没有意义,但完全有效)class 继承:
struct Area { int size; };
struct Pattern { int size; };
struct R : Area, Pattern {};
struct C : Area, Pattern {};
struct X: R , C {};
让我们看一下这个伟大的层次结构的图表:
Area Pattern
|\ /|
| \/ |
| /\ |
|/ \|
R C
\ /
\/
X
现在,如果我没记错的话,X 应该有 4 size
个成员。
如何使用范围运算符引用它们?
显而易见的解决方案不起作用:
X x;
x.R::Area::size = 24;
clang 错误:
23 : <source>:23:3: error: ambiguous conversion from derived class 'X' to base class 'Area': struct X -> struct R -> struct Area struct X -> struct C -> struct Area x.R::Area::size = 8; ^ 1 error generated.
gcc 错误:
<source>: In function 'auto test()': 23 : <source>:23:14: error: 'Area' is an ambiguous base of 'X' x.R::Area::size = 8; ^~~~
一些非常需要的说明:
我是瞎编的,不是真的设计
- 所以请不要指出设计上的问题
- 请不要认为这是一个好的设计。它是...不是 - 至少可以这么说
这完全是关于 C++ 语法 来解决歧义的。
- 请不要建议不要做
- 请不要建议虚拟继承。
类似于static_cast<R&>(x).Area::size = 8;
这应该是丑陋的:)
为了阐明为什么原始代码不起作用,值得一提的是,合格的 id 具有以下形式(除其他外)type-name::id
所以 x.R::Area::y
等同于 using T = R::Area; x.T::y;
就消除歧义而言,显然没有帮助。