簡體   English   中英

聲明/初始化私有嵌套結構的靜態成員

[英]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機器上的更復雜的代碼中產生的,而該錯誤基本上具有相同的錯誤。 (在“真實”代碼中,類聲明位於標頭中,而不是所有聲明在一個文件中,但是同樣,錯誤是相同的。)

這似乎應該工作。 正如消息所指示的那樣,當然可以將S聲明為私有的,但僅在私有成員變量s的上下文中使用它。 這是怎么了?為什么?

編輯:關於如何在C ++中初始化私有靜態成員的聲明重復項 ,明顯的區別是內部類的范圍,而不是一般如何初始化靜態成員變量。

這條線

O::S s { 0, 1 };

嘗試定義O::S類型的對象::s 這不是靜態成員的定義。 那個看起來像這樣:

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

S類在O的私有部分中聲明,因此O類之外的代碼無法訪問它。 具體來說,您不能在O類之外實例化S類,因為這將構成訪問私有聲明。

如果您希望能夠在類O之外創建S的實例,則應將其聲明為public。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM