'initializing':无法从'Array <int,3>'转换为'int'

时间:2015-11-29 14:31:36

标签: c++ arrays templates c++11 variadic-templates

请考虑以下代码:

#include <cstddef> //for std::size_t

template<class T, std::size_t Size>
class Array
{
private:
    T _data[Size];
public:
    template<class... Args>
    Array(Args&&... vals)
        : _data{ vals... }
    {}
};

int main()
{
    Array<int, 3> a = { 1, 2, 3 };
    Array<int, 3> b = { 4, 5, 6 };

    Array<Array<int, 3>, 2> arr = { a, b };
}

对于课程的前两个对象(ab),所有内容都按预期工作。

然后我声明一个数组数组(如果你愿意,可以使用2D数组)。因此,当执行Array<Array<int, 3>, 2> arr;的构造函数时,我相信模板参数T将等于Array<int, 3>。这样我们就能够成功地给Args&&...其他相同类型的对象。然后参数包将展开。

所以Array<Array<int, 3>, 2> arr;应该有一个私人成员:

Array<int, 3> _data[2];

显然不是,因为我收到了标题中的错误。

1 个答案:

答案 0 :(得分:0)

我无法理解编译错误消息,但显然提供了一个复制构造函数可以解决问题。

我认为因为您没有提供复制构造函数,所以它会尝试使用vals来直接初始化类成员,然后尝试在Array内分配int[]

不提供复制构造函数并尝试通过复制进行任何构造会产生相同的错误消息:

Array<int, 3> a = { 1, 2, 3 };
Array<int, 3> c = a;
  

main.cpp:17:26:错误:无法转换&#39;数组&#39;到&#39; int&#39;在初始化            :_data {vals ...}

所以我的猜测是这个奇怪的错误消息传播到你的列表初始化,因为它也使用了复制构造函数。