初始化结构成员数组时出错

时间:2020-08-13 12:58:16

标签: c++ arrays

我有这个结构:

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'的数组元素。有什么问题?

2 个答案:

答案 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;
}