我有这个结构:
template<int N>
struct XYarr
{
double x[N],y[N];
int size() {return N;}
};
当我尝试初始化它(并通过函数将其返回)
return XYarr<size>{x2, y2}; //x2 and y2 are arrays double[size]
我收到以下错误:无法使用类型为'double [200]'的左值初始化类型为'double'的数组元素。有什么问题?
答案 0 :(得分:3)
原始数组没有值语义。因此,无法使用=
运算符初始化或分配它们,而需要显式复制它们。例如,使用如下构造函数:
#include <algorithm>
template<int N>
struct XYarr
{
double x[N], y[N];
XYarr(const double(&x2)[N], const double(&y2)[N]) {
std::copy(std::begin(x2), std::end(x2), x);
std::copy(std::begin(y2), std::end(y2), y);
}
int size() const { return N; }
};
int main() {
double x2[4]{}, y2[4]{};
XYarr<4> test{ x2, y2 };
}
答案 1 :(得分:2)
编译器无法使用成员聚合初始化,因为无法复制C数组。
要克服这一点,请为您的结构提供一个构造函数:
template<int N>
struct XYarr
{
XYarr() = default; // default constructor if needed
XYarr(const double (&x_)[N], const double (&y_)[N]) {
memcpy(&x,x_,sizeof (double)*N);
memcpy(&y,y_,sizeof (double)*N);
}
double x[N],y[N];
int size() {return N;}
};
int main(int argc, char * argv[]) {
XYarr<100> a; // default constructor
double x2[100], y2[100];
auto n = XYarr<100>{x2, y2}; // init constructor
return 0;
}
有一个std :: array版本供比较。 std :: array可以与成员聚合初始化一起使用-因此没有样板代码,一切都很简单。
template<int N>
struct XYarr_stl
{
std::array<double,N> x,y;
int size() {return N;}
};
int main(int argc, char * argv[]) {
std::array<double,100> x2_stl, y2_stl;
auto n_stl = XYarr_stl<100>{x2_stl, y2_stl};
// this will give compilation error, because array sizes will be checked at compile time
//std::array<double,200> x2_stl2, y2_stl2;
//auto n_stl2 = XYarr_stl2<100>{x2_stl2, y2_stl2};
return 0;
}