我有以下代码:
class Base
{
private:
class NestedBase
{
public:
void Do() {}
};
public:
NestedBase nested;
};
int main()
{
Base b;
b.nested.Do(); // line A compiles
Base::NestedBase instance; // line B doesn't compile
}
NestedBase
类是Base
的私有嵌套类,因此B行无法编译似乎很自然。但是,另一方面,变量b
有公共成员nested
,我可以从Do()
之外调用其方法Base
(如第A行所示)。在这种情况下,规范对私有嵌套类(或其成员)的访问的准确规则是什么?标准对此有何看法?
答案 0 :(得分:6)
根据标准,$11.7/1 Nested classes [class.access.nest]:
嵌套类是成员,因此具有与任何其他成员相同的访问权限。
所以,它非常简单。 NestedBase
是班级private
的{{1}}成员,因此无法在Base
中访问Base::NestedBase
。
main()
没问题,因为b.nested.Do();
和nested
都是Do()
成员。 public
是NestedBase
嵌套类private
并不重要,这与此无关。
答案 1 :(得分:2)
类型名称NestedBase
是该类的私有成员。
class Base
{
private:
class NestedBase
{
public:
void Do() {}
};
//...
因此,您无法在声明名称的类之外显式访问它。
但您可以通过以下方式隐式访问该名称:)
decltype( Base::nested) instance;