Инициализировать частный агрегат из скобочного списка инициализации

Если я попытаюсь скомпилировать

class triangle
{
private:
    std::array<std::array<double, 2>, 3> m_vertices;
};

triangle const unit_triangle{ { { { 0, 0 }, { 1, 0 }, { 0, 1 } } } };

я получаю сообщение об ошибке

не может преобразовать из «списка инициализаторов» в «треугольник».

Если я заменю private на public, код успешно скомпилируется. Поскольку я не хочу этого делать: что мне нужно сделать, если я хочу инициализировать unit_triangle из списка с фигурными скобками?


person 0xbadf00d    schedule 21.03.2017    source источник


Ответы (1)


Наличие члена private не позволяет triangle быть агрегатом. Это агрегат, который позволяет вам инициализировать список triangle без конструктора triangle. Вот почему это работает, когда вы заменяете private на public.

Для поддержки нужного вам синтаксиса вам просто нужно добавить соответствующий конструктор. В таком случае:

class triangle
{
public:
    triangle(std::array<std::array<double, 2>, 3> const& v)
        : m_vertices(v)
    { }

private:
    std::array<std::array<double, 2>, 3> m_vertices;
};
person Barry    schedule 21.03.2017