[英]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.