为什么继承的结构成员在联合中无法访问?
Why inherited struct members are inaccessible in union?
>我有以下代码在编译时生成错误:
struct s { int three; };
union alias {
struct { int one; };
struct { int two; };
struct : s {};
};
int main()
{
alias a;
a.one = 1; // OK
a.two = 2; // OK
a.three = 3; // error: 'union alias' has no member named 'three'
return 0;
}
由于某种原因,联合中继承结构的成员无法访问。此代码的主要目的是为结构s
的成员提供别名。
为什么编译器看不到继承结构的成员?有什么选项可以使它们可访问吗?
好的,经过一番挠头,我想我可以正确解释这一点。好吧,首先,这是非法的,因为Heck(tm(。
在联合中定义的struct
会让编译器感到困惑。如果结构 def 后跟名称,通常会创建此类结构类型的新变量,但C++明确不允许匿名结构。如果省略该名称,则可能意味着两件事 - 要么创建匿名结构类型,然后立即删除(符合-Wpedantic
警告(,要么,就像GCC似乎发生的那样,它认为它是匿名类型的匿名成员的创建,这是一个非标准扩展:
union alias {
struct { int one; }; // anonymous member of an anonymous type
struct a { int two }; // no member, just def of "struct a"
struct { int three; } b; // named (b) member of type anonymous struct
};
总而言之,你不能指望这能奏效......除非使用显式类型和数据成员名称创建联合成员:
struct s { int three; };
union alias {
struct A { int one; };
struct B { int two; };
struct C : s { };
A a;
B b;
C c;
};
int main() {
alias a;
a.a.one = 1; // OK
a.b.two = 2; // OK
a.c.three = 3; // OK
}
整个匿名工会成员的事情对我来说仍然有点令人费解,因为我无法在标准中找出任何可以使这项工作的东西。
相关文章:
- 继承和友元函数,从基类访问受保护的成员
- 如何在复杂继承中访问静态成员变量
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 为什么继承的结构成员在联合中无法访问?
- C++继承,无法访问继承的元素
- 构造函数无法访问继承类私有 int
- 重载<<无法访问继承的私有数据
- Qt:如何访问继承的小部件?
- C++无法访问继承类中的字段
- 为什么友元函数无法访问继承类的私有变量?
- 无法访问继承的类属性
- 如何访问继承的成员
- Qt 访问继承类的 D 指针
- 在构造基类期间访问继承的方法
- 当基类要访问继承类的成员时
- 在c++中如何访问继承类中的私有基成员变量
- 访问继承中的私有成员
- 如何在Windows中访问继承的匿名管道HANDLE,而不是stdout,stderr和stdin?
- 使用内部类继承模板类,并访问继承类中的内部类
- 我如何访问继承代码的不同部分