我在C ++中创建了一个容器类,我有一个来自迭代器的构造函数,所以我可以写MyContainer<double> x(v.begin(), v.end())
v
是std::vector<double>
。我希望能够用c-array做同样的事情,但是:
double array[3] = {1., 2. , 3.};
MyContainer<double> x(array, array+3); // Doesn't work : no matching function for call to ‘MyContainer<double>::MyContainer(double [3], double*)’
MyContainer<double> x(array+0, array+3); // Work
问题的根源是什么以及如何解决?
非常感谢。
答案 0 :(得分:4)
不接受对迭代器的引用,按值获取它们。它试图传递对数组的引用;失败的表达式需要数组衰减为指针。
大概你有
template< typename Iter >
MyContainer( Iter const &first, Iter const &last );
但你需要
template< typename Iter >
MyContainer( Iter first, Iter last );
迭代器需要足够轻量级才能传递值;所有标准模板都这样做。
数组不能用作迭代器,因为它不能递增。存储是固定的。在类似arr + 0
的表达式中使用数组或将值按值传递给函数时,它会隐式转换为指向其第一个元素的指针。但是,当通过引用传递时,这种转换不会发生。
答案 1 :(得分:3)
array+0
的结果是指针,而array
本身不是指针,它是一个数组。您的构造函数没有带有数组和指针的重载,因此编译失败。
处理从数组中创建开始和结束迭代器的问题的惯用方法是使用begin(...)
和end(...)
函数:
MyContainer<double> x(std::begin(array), std::end(array));
重载负责确定数组末尾的位置,使您无需在指针中添加数组长度。