2015-04-12 133 views
1

foo類需要一個靜態C++ array爲我最終宣佈這樣一個私有成員:聲明靜態私有數組成員

class Foo : public Bar { 

private: 

    constexpr static array<int, 18> rouges = {1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36}; 
    // ... 
} 

但是編譯器會引發

error: array must be initialized with a brace-enclosed initializer 
error: too many initializers for 'const std::array<int, 18u>' 

有趣的事情我的數組大小正好在這裏18元素,如果我宣佈它array<int, 500>我仍然得到too many initializers錯誤。至於大括號初始化錯誤,我不明白編譯器期望讀取什麼。

我自己記錄通過觀察的C++(11.3.1 array)Stroustrup的一個巡迴賽,但我不知道他是怎麼做到的不同,我做到了。或者,刪除constexpr static關鍵字不會消除錯誤。

感謝您的洞察力。

+0

你使用什麼編譯器? [我沒有收到任何錯誤](http://ideone.com/TvfeqI)。 –

+0

Mingw與C++ 11標誌。 – PinkTurtle

回答

0

使用一個更對大括號

constexpr static array<int, 18> rouges = { { 1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36 } }; 
    // ... 

實際上有兩個聚集體其中之一在另一個ecnlosed。

STD的初始化;:數組定義等(23.3.2.1類模板陣列概述)

2數組是一個集合體(8.5.1),其可以與所述 語法陣列的被初始化= {初始化名單};其中 初始化-list是(8.5.1聚集體),其 類型轉換爲T.

和最多n個元素的逗號分隔的列表

11牙套可以在被消隱初始化器列表如下。 如果 初始值設定項列表以一個左大括號開頭,則後續的 逗號分隔的初始化子句列表會初始化 的子成員子集;這是錯誤的,因爲有更多的 初始化子句比成員。

+1

那麼工作,但...爲什麼?!你能否詳細說明一下?我所看到的所有內容均以1維列表的形式列出。 – PinkTurtle

+2

[This answer](http://stackoverflow.com/a/14178283/3854322)解釋了爲什麼 – BlackDwarf

+0

我很困惑,因爲* Stroustrup的C++ *遊覽(11.3.1'array')定義它:'array a1 = {1,2,3}'。 @DeepBlackDwarf感謝您的鏈接。那麼我想那個錯誤是依賴於編譯器的呢?我沒有得到警告,但在我的嘗試中出現了一個真正的錯誤。 – PinkTurtle