声明/初始化私有嵌套结构的静态成员
Declare / initialize static member of private nested struct
我有这个示例代码(在名为 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 机器上更复杂的代码中,错误基本相同。 (在 "real" 代码中,class 声明在一个文件头中,而不是全部在一个文件中,但同样,错误是相同的。)
这看起来应该可行。当然 S
被声明为私有,如消息所示,但它仅在私有成员变量 s
的上下文中使用。这里有什么问题,为什么?
编辑:关于在 How to initialize private static members in C++? 处声明的重复项,明显的区别在于内部 class 的范围,而不是一般如何初始化静态成员变量。
S class 在 O 的私有部分声明,因此 class O 之外的代码无法访问它。具体来说,您不能在 class O 之外实例化 class S,因为那样会构成访问私有声明。
如果 S 在 class O 之外,如果你想创建实例,你应该声明它 public。
这一行
O::S s { 0, 1 };
尝试定义类型 O::S
的对象 ::s
。它不是静态成员的定义。那个看起来像这样:
O::S O::s { 0, 1 };
我有这个示例代码(在名为 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 机器上更复杂的代码中,错误基本相同。 (在 "real" 代码中,class 声明在一个文件头中,而不是全部在一个文件中,但同样,错误是相同的。)
这看起来应该可行。当然 S
被声明为私有,如消息所示,但它仅在私有成员变量 s
的上下文中使用。这里有什么问题,为什么?
编辑:关于在 How to initialize private static members in C++? 处声明的重复项,明显的区别在于内部 class 的范围,而不是一般如何初始化静态成员变量。
S class 在 O 的私有部分声明,因此 class O 之外的代码无法访问它。具体来说,您不能在 class O 之外实例化 class S,因为那样会构成访问私有声明。
如果 S 在 class O 之外,如果你想创建实例,你应该声明它 public。
这一行
O::S s { 0, 1 };
尝试定义类型 O::S
的对象 ::s
。它不是静态成员的定义。那个看起来像这样:
O::S O::s { 0, 1 };