我为一个简单的文本编辑器编写了一个自定义迭代器Text_Iterator,但是STL算法(如find())无法将其识别为合法的迭代器。
我的代码是:
using Line = std::vector<char>;
class Text_iterator {
std::list<Line>::iterator ln;
Line::iterator pos;
public:
Text_iterator(std::list<Line>::iterator ll, Line::iterator pp)
: ln{ll}, pos{pp} {}
char& operator*() { return *pos; }
Text_iterator& operator++();
Text_iterator& operator--();
bool operator==(const Text_iterator& other) const
{
return (ln == other.ln && pos == other.pos);
}
bool operator!=(const Text_iterator& other) const
{
return (!(*this == other));
}
};
字符串
当我尝试在算法中使用这个迭代器时,例如在find()中,我得到以下错误:
1>...\xutility(861,56): error C2794: 'value_type': is not a member of any direct or indirect base class of 'std::iterator_traits<_InIt>'
1> with
1> [
1> _InIt=Text_iterator
1> ]
型
为什么它不能注册为合法的迭代器?
Edit:使用以下附加声明:
using iterator_category = std::bidirectional_iterator_tag;
using difference_type = std::ptrdiff_t;
using value_type = char;
using pointer = char*;
using reference = char&;
型
1条答案
按热度按时间qnyhuwrf1#
错误消息是抱怨
std::iterator_traits
在应用到Text_iterator
类时没有value_type
成员。你的类的
operator*
返回了一个char&
,但是你的类没有一个value_type
成员,别名是char
,例如:字符串
std::find()
只适用于满足InputIterator或ForwardIterator要求的迭代器。所以你要么
value_type
之外还有很多),这样默认的std::iterator_traits
就可以找到它们。std::iterator_traits
。