我有这个示例代码(在名为A.cpp
的文件中):
class O {
private:
struct S {
int i;
int j;
};
static struct S s;
};
O::S s { 0, 1 };
我在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机器上更复杂的代码中,但错误基本相同。 (在"真正的"代码中,类声明在一个标题中而不是在一个文件中,但是,错误是相同的。)
这似乎应该有效。当然,S
被声明为私有,如消息所示,但它仅在私有成员变量s
的上下文中使用。这里有什么不对,为什么?
编辑:关于在How to initialize private static members in C++?声明的副本,明显的区别是内部类的范围,而不是一般如何初始化静态成员变量。
答案 0 :(得分:3)
这一行
O::S s { 0, 1 };
尝试定义::s
类型的对象O::S
。它不是静态成员的定义。那个看起来像这样:
O::S O::s { 0, 1 };
答案 1 :(得分:-1)
S类在O的私有部分声明,因此O类之外的代码无法访问它。具体来说,您不能在类O之外实例化类S,因为这将构成访问私有声明。
如果您希望能够在类O之外创建实例,则应将其声明为公共。