【发布时间】:2018-06-02 21:13:17
【问题描述】:
作为练习,我正在尝试编写一个供std::sort 使用的自定义迭代器。从它的文档中,我读到:
[我的迭代器]必须满足ValueSwappable和
RandomAccessIterator的要求。
没有完全实现那些1,我来到了这个MCVE:
#include <iostream>
#include <algorithm>
struct mcve_random_access_iterator
{
using size_type = std::size_t;
using value_type = int;
size_type _index;
value_type* _values;
mcve_random_access_iterator(value_type* values) : _index(0), _values(values) {}
mcve_random_access_iterator& operator-(const mcve_random_access_iterator& rhs) { _index-=rhs._index ; return *this; }
value_type& operator*() { return _values[_index]; }
friend bool operator==(mcve_random_access_iterator& lhs, mcve_random_access_iterator& rhs) { return lhs._index == rhs._index; }
friend bool operator!=(mcve_random_access_iterator& lhs, mcve_random_access_iterator& rhs) { return !(lhs == rhs); }
};
void swap(mcve_random_access_iterator& lhs, mcve_random_access_iterator& rhs)
{
std::swap(*lhs, *rhs);
}
struct mcve_container
{
int _values[3];
mcve_container() : _values{2, 3, 1} {}
mcve_random_access_iterator begin() { return {_values}; }
mcve_random_access_iterator end() { auto b = begin(); b._index = sizeof(_values)/sizeof(_values[0]); return b; }
};
int main()
{
mcve_container data;
std::sort(data.begin(), data.end());
for (auto n : data._values)
std::cout << n << ", ";
std::cout << "\n";
}
用g++ 7.2.0编译,出现如下错误:
/usr/local/include/c++/7.2.0/bits/stl_algo.h:1969:14: error: no matching function for call to '__lg(mcve_random_access_iterator&)' std::__lg(__last - __first) * 2,
为什么会出现此错误以及如何解决?
1) 我已经从mcve_random_access_iterator 中删除了 RandomAccessIterator 的所有要求,但仍然会重现错误。
【问题讨论】:
-
在减少示例方面做得很好。让我更快地意识到实际问题。
-
如果你不提供 all of
value_type,difference_type,reference, @,你就不是 任何类型的迭代器987654332@,iterator_category(直接或通过提供std::iterator_traits的专业化)
标签: c++ iterator standard-library