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

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 };