C ++:私有嵌套类类型的公共成员

时间:2016-01-23 15:06:05

标签: c++ inner-classes class-visibility

我有以下代码:

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行所示)。在这种情况下,规范对私有嵌套类(或其成员)的访问的准确规则是什么?标准对此有何看法?

2 个答案:

答案 0 :(得分:6)

根据标准,$11.7/1 Nested classes [class.access.nest]

  

嵌套类是成员,因此具有与任何其他成员相同的访问权限。

所以,它非常简单。 NestedBase是班级private的{​​{1}}成员,因此无法在Base中访问Base::NestedBase

main()没问题,因为b.nested.Do();nested都是Do()成员。 publicNestedBase嵌套类private并不重要,这与此无关。

答案 1 :(得分:2)

类型名称NestedBase是该类的私有成员。

class Base
{
private:
    class NestedBase
    {
    public:
        void Do() {}
    };
    //...

因此,您无法在声明名称的类之外显式访问它。

但您可以通过以下方式隐式访问该名称:)

decltype( Base::nested) instance;