Как я могу инициализировать член std :: массив объектов, которые не имеют конструктора по умолчанию? - PullRequest
5 голосов
/ 27 декабря 2011

Вот код, с которым у меня проблема:

class Foo {
public:
    Foo() :
        memberArray{Bar(1), Bar(3), Bar(2)}
    {}
    struct Bar {
        Bar(int param1) {  }
    };
private:
    std::array<Bar,3> memberArray;
//  Bar memberArray[3];    // Using a raw array like this instead compiles fine..
};

Я использую GCC 4.6.1 и компилирую для c ++ 11. Как мне инициализировать мой std :: array?

Ответы [ 4 ]

5 голосов
/ 27 декабря 2011

Поскольку array<T, N> на самом деле является структурой, для полной версии скобки требуется {{ .. }} (внутренние для элемента массива объекта array<T, N>).Спецификация не допускает исключения скобки здесь.Это допускается только в объявлении вида

Type var = { ... };

. Поэтому вы должны использовать полностью ограниченный синтаксис

Foo() :
    memberArray{{Bar(1), Bar(3), Bar(2)}}
{}

Это не ошибка GCC, но требуется спецификацией.

2 голосов
/ 27 декабря 2011

В качестве обходного пути у вас может быть функция, возвращающая экземпляр этого массива.

#include <array>

class Foo {
public:
    Foo() :
        memberArray(makeMemberArray())
    {}
    struct Bar {
        Bar(int param1) {  }
    };
private:
    std::array<Bar,3> memberArray;
//  Bar memberArray[3];    // Using a raw array like this instead compiles fine..

    static std::array<Bar, 3> makeMemberArray() { 
      std::array<Bar,3> a = {Bar(1), Bar(2), Bar(3)}; 
      return a; 
    }
};

Я думаю, что единообразная инициализация должна позволять делать то, что вы делаете, за исключением того, что она не может быть реализована компилятором.

0 голосов
/ 15 января 2018

Опираясь на Йоханнеса Шауба - ответ Литба ... по крайней мере, GCC позволит вам использовать сокращенный синтаксис (исключая бессмысленное имя класса):

Foo() :
    memberArray{{ {1}, {3}, {2} }}
{}

вместо

Foo() :
    memberArray{{Bar(1), Bar(3), Bar(2)}}
{}

Лично я использую что-то вроде второй версии, когда инициализирую массив полиморфных указателей:

Foo() :
    memberArray{{
        dynamic_cast<Bar*>(new BarA(1)),
        dynamic_cast<Bar*>(new BarB(3)),
        dynamic_cast<Bar*>(new BarC(2))
    }}
{}
0 голосов
/ 27 декабря 2011

Попробуйте (это работает для g ++ 4.5.2):

  Foo() :
      memberArray (std::array<Bar,3> {Bar(1), Bar(3), Bar(2)})
  {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...