考虑:
class C {
private:
class T {int a, b;};
};
C::T *p;
正如预期的那样,这会产生一个编译错误,说C:T在第6行的上下文中是私有的。
现在将其更改为指向成员的指针:
class C {
private:
class T {int a, b;};
};
int C::T::*p;
这一次,gcc版本3.2.3仍然提出同样的抱怨,但gcc版本3.4.3允许它通过。根据标准,这是正确的行为?
答案 0 :(得分:3)
由于T
除了C
类之外的任何地方都不可见,我无法想象它会被允许。
在Comau身上试过这个,他告诉我同样的事情。可悲的是,我不太了解我的标准,所以不能指出你。
答案 1 :(得分:3)
要添加到 xtofl 的帖子,请参阅标准的第11章([class.access]):
班级成员可以是
- 私人;也就是说,它的名称只能由其所在类的成员和朋友使用 声明。
- 受保护;也就是说,它的名称只能由其所在类的成员和朋友使用 声明,并由本课程的成员和朋友宣布(见11.5)。
- 公开;也就是说,它的名称可以在没有访问限制的任何地方使用。