C++ 声明/初始化私有嵌套结构的静态成员

C++ 声明/初始化私有嵌套结构的静态成员,c++,static,inner-classes,private-members,C++,Static,Inner Classes,Private Members,我有这个示例代码(在一个名为a.cpp的文件中): 我使用Mac上的命令行中的g++-c-std=c++11 A.cpp进行编译,得到以下错误: A.cpp:11:4: error: 'S' is a private member of 'O' O::S s { 0, 1 }; ^ A.cpp:3:9: note: declared private here struct S { ^ 1 error generated 这个问题最初出现在li

我有这个示例代码(在一个名为
a.cpp
的文件中):

我使用Mac上的命令行中的
g++-c-std=c++11 A.cpp
进行编译,得到以下错误:

A.cpp:11:4: error: 'S' is a private member of 'O'
O::S s { 0, 1 };
   ^
A.cpp:3:9: note: declared private here
        struct S {
               ^
1 error generated
这个问题最初出现在linux机器上更复杂的代码中,基本上是相同的错误。(在“real”代码中,类声明位于头文件中,而不是位于一个文件中,但是,同样,错误是相同的。)

这似乎应该奏效。当然,正如消息所示,
S
声明为私有,但它仅在私有成员变量
S
的上下文中使用。这里出了什么问题,为什么


编辑:关于声明的重复at,明显的区别在于内部类的范围,而不是如何初始化静态成员变量。

S类在O的私有部分声明,因此类O之外的代码无法访问它。具体来说,您不能在类O之外实例化类S,因为这将构成访问私有声明

如果你想在O类之外创建实例,你应该将它声明为公共的。

这一行

O::S s { 0, 1 };
尝试定义类型为
O::s
的对象
::s
。这不是静态成员的定义。那一个看起来像这样:

O::S O::s { 0, 1 };

可能是@user657267的重复我看到了这个问题,但它没有内部类的附加问题,这是最终的问题。我做了一个小编辑,但这就是问题所在。一组冒号用于类型,然后(缺少)用于
s
范围。谢谢@砖头-哦,是的,谢谢你的编辑!我想我有点昏昏欲睡:)
O::S O::s { 0, 1 };