【问题标题】:How to initialize a static field of which type is a private nested class?如何初始化哪个类型的静态字段是私有嵌套类?
【发布时间】:2013-03-06 19:39:15
【问题描述】:

Outer.hpp

class Outer {
  class Inner {
    Inner() {}
  };
  static Inner inner;
}

Outer.cpp(在顶层,例如不在函数体内):

Outer::Inner Outer::inner;

我收到以下错误:

error C2248: 'Outer::Inner::inner' : cannot access private member declared in class 'Outer::Inner'

我没有使用完全符合 C++11 (Visual Studio 2010) 的编译器,因此无法在声明时定义字段。

【问题讨论】:

    标签: c++ static initialization private friend


    【解决方案1】:

    诀窍是让Outer 成为Inner 的朋友:

    Outer.hpp

    class Outer {
      class Inner {
        Inner() {}
        friend Outer;
      }
      static Inner inner;
    }
    

    现在,Outer 可以看到 Inner 的类型,即使在实现文件中也好像不是私有的,因此 Outer.cpp 中的初始化成功。

    【讨论】:

    • 很遗憾,这不适用于内部typedefs,因为您无法为这些指定朋友。
    【解决方案2】:

    不,你不需要加好友。坏主意。

    class Innerclass Outer 的私有成员。这没有什么问题。

    问题取决于您将定义放在哪里。

    Outer::Inner Outer::inner; // is fine in the global space.
    int main()
    {
        Outer::Inner Outer::inner; // Fails because it's used as a local variable to function main.
    }
    

    【讨论】:

    • 没有。主函数内部的Outer::Inner Outer::inner; 是什么意思?请参阅我的第一条评论中的 Ideone 链接。错误:无效使用限定名“Outer::inner”
    • @TadeuszKopec 您的代码(ideone)很好。在我看来,达特尼乌斯正在做一些不同的事情。将其放置在上下文之外的某个地方,例如 main,意味着他将静态定义放置在错误的位置。如果这只是一个语法问题,他就不会得到他提到的错误。
    • 我现在澄清定义是放在顶层的。
    • 在这种情况下,它抱怨 Inner 的构造函数在 Outer 尝试初始化它时是私有的。默认情况下,类的成员是 private,因此 Outer 将无法使用该构造函数创建对象。在内部构造函数声明之前放入public: 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多