c++ find()无法识别我的自定义迭代器

kse8i1jr  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(97)

我为一个简单的文本编辑器编写了一个自定义迭代器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&;

qnyhuwrf

qnyhuwrf1#

错误消息是抱怨std::iterator_traits在应用到Text_iterator类时没有value_type成员。
你的类的operator*返回了一个char&,但是你的类没有一个value_type成员,别名是char,例如:

class Text_iterator {
    ...

public:
    typedef char value_type;
    // or: using value_type = char;
    // or: typedef std::iterator_traits<Line::iterator>::value_type value_type;
    // or: using value_type = st::iterator_traits<Line::iterator>::value_type;
    ...
};

字符串
std::find()只适用于满足InputIteratorForwardIterator要求的迭代器。
所以你要么

  • 添加所需的成员到你的类中(除了value_type之外还有很多),这样默认的std::iterator_traits就可以找到它们。
  • 为您的类指定std::iterator_traits

相关问题