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

时间:2018-04-12 20:17:03

标签: c++ static inner-classes private-members

我有这个示例代码(在名为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++?声明的副本,明显的区别是内部类的范围,而不是一般如何初始化静态成员变量。

2 个答案:

答案 0 :(得分:3)

这一行

O::S s { 0, 1 };

尝试定义::s类型的对象O::S。它不是静态成员的定义。那个看起来像这样:

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

答案 1 :(得分:-1)

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

如果您希望能够在类O之外创建实例,则应将其声明为公共。