如何初始化哪个类型的私有嵌套类的静态字段?

时间:2013-03-18 12:53:13

标签: c++ static initialization private friend

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)的编译器,因此无法在声明时定义字段。

2 个答案:

答案 0 :(得分:4)

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

Outer.hpp

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

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

答案 1 :(得分:1)

不,你不需要朋友。不好的主意。

class Inner 类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.
}