2015-04-12 3 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), но я не вижу, как он сделал это по-другому, что я сделал. Кроме того, удаление 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 в другом.

инициализации станд;: массив определяется как (обзор шаблона массива 23.3.2.1 Class)

2 Массив представляет собой совокупность (8.5.1), который может быть инициализирован с синтаксиса массив = {Инициализатор-лист}; где инициализатора-список разделенных запятых список до N элементов, чьи типов могут быть конвертированы в T.

и (8.5.1 Заполнителей)

11 Скоба может быть опущен в initializer-list следующим образом. Если список инициализаторов начинается с левой фигурной скобки, то следующий список инициализаторов-разделов, разделенных запятыми, инициализирует элементы a subaggregate; ошибочно, чтобы было больше элементов-инициализаторов, чем членов.

+1

Ну, это сработало, но ... почему?! Не могли бы вы рассказать? Все, что я вижу здесь, в 1-мерном списке ints. – PinkTurtle

+2

[Этот ответ] (http://stackoverflow.com/a/14178283/3854322) объясняет, почему – BlackDwarf

+0

Я смущен, потому что * Stroustrup's Tour of C++ * (11.3.1 'array') определяет его:' array a1 = {1,2,3} '. @DeepBlackDwarf благодарит за ссылку. Я предполагаю, что тогда ошибка зависит от компилятора? У меня не было предупреждения, но я ошибся в своей попытке. – PinkTurtle

Смежные вопросы