繁体   English   中英

如何使用带有聚合初始化的 std::array 定义向量类?

[英]How to define a vector class using std::array with aggregate initialization?

我定义了一个这样的类

#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){ }

我想知道如何使构造函数中的聚合初始化有效。

std::array不能从std::initializer_list构造。 如果您想保留std::array成员,您有两个选择来解决这个问题。 您可以通过公开arr并删除构造函数来进行vec和聚合

#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

std::array没有任何构造函数。 它只有聚合初始值设定项。 如果用std::vector替换std::array它应该可以工作,因为 vector 具有初始化列表构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM