我有通常使用标准容器作为基础字段的类。例如,我有一堂课
template <typename T>
class Vec_3D
{
public:
/* ... */
std::array<T, 3> vec;
/* ... */
};
它只有一个变量 vec
其余的只是我在使用向量时需要的函数。我希望能够使用基于范围的 for 循环,例如
Vec_3D<double> vec;
for (double val : vec) {/*...*/}
这显然应该迭代 std::array<double, 3>
。
如何在我的类中实现迭代器,而这些迭代器又应该调用 std::array<T, 3>
的迭代器?
我从 这个问题 开始,并尝试在我的类中定义迭代器为
typedef std::iterator<std::random_access_iterator_tag, T, ptrdiff_t, T*, T&> iterator;
typedef std::iterator<std::random_access_iterator_tag, const T, ptrdiff_t, const T*, const T&> const_iterator;
inline iterator begin() noexcept { return vec.begin(); }
inline const_iterator cbegin() const noexcept { return vec.cbegin(); }
inline iterator end() noexcept { return vec.end(); }
inline const_iterator cend() const noexcept { return vec.end(); }
但出现编译错误
error: no match for ‘operator!=’ (operand types are ‘Vec_3D<double>::iterator {aka std::iterator<std::random_access_iterator_tag, double, long int, double*, double&>}’ and ‘Vec_3D<double>::iterator {aka std::iterator<std::random_access_iterator_tag, double, long int, double*, double&>}’)
和 operator++, operator*
原文由 Michal 发布,翻译遵循 CC BY-SA 4.0 许可协议
A range-based for loop only requires that your class have
begin()
andend()
methods (or overloads ofstd::begin()
andstd::end()
) that return迭代器。它不关心那些迭代器来自哪里。因此,最简单的解决方案是只使用数组自己的迭代器,而不是尝试定义自己的迭代器,例如: