2

我在 C++ 中创建了一个容器类,并且我有一个来自迭代器的构造函数,所以我可以写MyContainer<double> x(v.begin(), v.end())where vis a 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

问题的根源是什么以及如何解决?

非常感谢。

4

2 回答 2

4

不要接受对迭代器的引用,按值获取它们。它试图传递对数组的引用;失败的表达式需要数组衰减到一个指针。

大概你有

template< typename Iter >
MyContainer( Iter const &first, Iter const &last );

但你需要

template< typename Iter >
MyContainer( Iter first, Iter last );

迭代器需要足够轻量级才能按值传递;所有标准模板都这样做。

数组不能用作迭代器,因为它不能递增。存储是固定的。当您在表达式中使用数组arr + 0或将其按值传递给函数时,它会隐式转换为指向其第一个元素的指针。但是通过引用传递时不会发生这种转换。

于 2012-07-30T11:57:31.820 回答
3

的结果array+0是一个指针,而array它本身不是一个指针,它是一个数组。您的构造函数没有采用数组和指针的重载,因此编译失败。

处理从数组创建开始和结束迭代器的问题的惯用方法是使用begin(...)andend(...)函数:

MyContainer<double> x(std::begin(array), std::end(array));

重载负责确定数组的末尾在哪里,从而使您无需将数组的长度添加到指针中。

于 2012-07-30T11:59:27.330 回答