考虑以下代码:
#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 };
}
一切对类的前两个对象(a
和b
)均起作用。
然后,我声明一个数组数组(如果需要,则为2D数组)。因此,当Array<Array<int, 3>, 2> arr;
执行的构造函数时,我相信template参数T
将等于Array<int, 3>
。这样,我们应该能够成功地提供Args&&...
其他相同类型的对象。然后参数包将扩展。
因此Array<Array<int, 3>, 2> arr;
,本质上应该有一个私有成员:
Array<int, 3> _data[2];
显然不是,因为出现标题中的错误。
我不太理解该编译错误消息,但是显然提供了一个复制构造函数可以解决该问题。
我认为,因为您没有提供复制构造函数,所以它尝试使用vals ...来直接初始化类成员,然后尝试在Array
内部分配一个int[]
。
不提供复制构造函数并尝试通过复制进行任何构造都会导致相同的错误消息:
Array<int, 3> a = { 1, 2, 3 };
Array<int, 3> c = a;
main.cpp:17:26:错误:初始化时无法将“数组”转换为“整数”:_data {vals ...}
所以我的猜测是,这个奇怪的错误消息传播到您的列表初始化,因为它还使用了复制构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句