'initializing':无法从 'Array<int,3>' 转换为 'int'
'initializing': cannot convert from 'Array<int,3>' to 'int'
考虑以下代码:
#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 };
}
class.
的前两个 objects(a
和 b
)一切正常
然后我声明一个数组数组(如果您愿意,可以是二维数组)。因此,当执行 Array<Array<int, 3>, 2> arr;
的构造函数时,我相信模板参数 T
将等于 Array<int, 3>
。这样我们应该能够成功地给 Args&&...
个相同类型的其他 objects 个。然后参数包会展开。
所以Array<Array<int, 3>, 2> arr;
本质上应该有一个私有成员:
Array<int, 3> _data[2];
显然不是,因为我得到了标题中的错误。
我无法理解该编译错误消息,但显然提供复制构造函数可以解决问题。
我认为是因为你没有提供复制构造函数,所以它尝试使用 vals... 直接初始化 class 成员,然后尝试在其中分配一个 Array
int[]
.
不提供复制构造函数并尝试通过复制进行任何构造会导致相同的错误消息:
Array<int, 3> a = { 1, 2, 3 };
Array<int, 3> c = a;
main.cpp:17:26: error: cannot convert 'Array' to 'int' in initialization
: _data{ vals... }
所以我猜这个奇怪的错误消息会传播到您的列表初始化,因为它也使用复制构造函数。
考虑以下代码:
#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 };
}
class.
的前两个 objects(a
和 b
)一切正常
然后我声明一个数组数组(如果您愿意,可以是二维数组)。因此,当执行 Array<Array<int, 3>, 2> arr;
的构造函数时,我相信模板参数 T
将等于 Array<int, 3>
。这样我们应该能够成功地给 Args&&...
个相同类型的其他 objects 个。然后参数包会展开。
所以Array<Array<int, 3>, 2> arr;
本质上应该有一个私有成员:
Array<int, 3> _data[2];
显然不是,因为我得到了标题中的错误。
我无法理解该编译错误消息,但显然提供复制构造函数可以解决问题。
我认为是因为你没有提供复制构造函数,所以它尝试使用 vals... 直接初始化 class 成员,然后尝试在其中分配一个 Array
int[]
.
不提供复制构造函数并尝试通过复制进行任何构造会导致相同的错误消息:
Array<int, 3> a = { 1, 2, 3 };
Array<int, 3> c = a;
main.cpp:17:26: error: cannot convert 'Array' to 'int' in initialization : _data{ vals... }
所以我猜这个奇怪的错误消息会传播到您的列表初始化,因为它也使用复制构造函数。