Как определить векторный класс, используя std :: array с агрегатной инициализацией? - PullRequest
0 голосов
/ 14 января 2020

Я определяю такой класс

#include<array>
template<class T,size_t D> 
class vec{
    private:
        std::array<T,D> arr;
    public:
        vec(std::initializer_list<T> l) : arr(l){ }
};

Затем я создаю объект этого класса следующим образом.

vec<int,3> v = {1,2,3};

Затем получаю ошибку

main.cpp:5:26: error: cannot bind non-const lvalue reference of type ‘std::initializer_list<int>&’ to an rvalue of type ‘std::initializer_list<int>’
     vec<int,3> v = {1,2,3};
                          ^
In file included from main.cpp:1:
vec.hpp:12:9: note:   initializing argument 1 of ‘vec<T, D>::vec(std::initializer_list<_Tp>&) [with T = int; long unsigned int D = 3]’
         vec(std::initializer_list<T>& l) : arr(l){ }

Интересно, как сделать действительную агрегированную инициализацию в моем конструкторе.

Ответы [ 2 ]

2 голосов
/ 14 января 2020

A std::array не может быть построено из std::initializer_list. У вас есть два варианта исправить это, если вы хотите сохранить std::array член. Вы можете сделать vec и агрегировать, сделав arr publi c и удалив конструктор, например

#include<array>
template<class T,size_t D> 
class vec{
    public:
        std::array<T,D> arr;
};

int main()
{
    vec<int,3> v = {1,2,3};
}

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

#include<array>
template<class T,size_t D> 
class vec{
    private:
        std::array<T,D> arr;
    public:
        vec(std::initializer_list<T> l)
        {
            std::copy_n(l.begin(), std::min(l.size(), arr.size()), arr.begin());
        }
};

int main()
{
    vec<int,3> v = {1,2,3};
}

Этот метод требует, чтобы члены массива были конструируемыми по умолчанию. Если вы не можете / не хотите гарантировать, что вам нужен первый вариант или переключитесь на использование другого типа для arr, например std::vector.

0 голосов
/ 14 января 2020

std::array не имеет конструкторов. Имеет только агрегатный инициализатор. Если вы замените std::array на std::vector, это должно сработать, потому что vector имеет конструктор списка инициализаторов.

...