错误 C2794“iterator_category”:不是“std::iterator_traits<_InIt>”的任何直接或间接基类的成员

问题描述 投票:0回答:1

这是我的代码:

#include <algorithm>
#include <iostream>
#include <string>

class StrReader {
public:
    class iterator {
    public:
        typedef size_t  difference_type;
        typedef char value_type;
        typedef value_type* pointer_type;
        typedef value_type& reference;
        typedef std::forward_iterator_tag iterator_category;

        explicit iterator(char* stream)
            :value(*stream)
            ,pos(stream)
        {}

        reference operator*()
        {
            return value;
        }

        pointer_type operator->()
        {
            return &value;
        }

        iterator& operator++()
        {
            pos += 1;
            value = *pos;
            return *this;
        }

        iterator operator++(int)
        {
            iterator temp(*this);
            ++*this;
            return temp;
        }

        bool operator==(const iterator& rhs) const 
        {
            return (value == rhs.value && pos == rhs.pos);
        }

        bool operator!=(const iterator& rhs) const
        {
            return (value != rhs.value && pos != rhs.pos);
        }

    private:
        value_type value;
        char* pos;
    };

    explicit StrReader(char* input)
        :str(input)
    {}

    iterator begin()
    {
        return iterator(str);
    }

    iterator end() const
    {
        return iterator(str+strlen(str));
    }

private:
    char* str;
};

int main()
{
    char* str = new char[1024]();
    strcpy(str, "Hello World +1");
    StrReader reader(str);
    std::transform(reader.begin(), reader.end(), reader.begin(), toupper);
    return 0;
}

编译代码时出错:

Error C2794 "iterator_category": not a member of any direct or indirect base class of "std::iterator_traits<_InIt>".
 with
 [
 _InIt=StrReader::iterator
 ] charArray D:\Program Files\visual studio\VC\Tools\MSVC\14.39.33519\include\xutility 1076     

我不知道代码出了什么问题,我只是想实现一个遍历字符数组的迭代器,但我不想使用C++ STL容器。

c++ iterator
1个回答
0
投票
typedef value_type* pointer_type;

应该是

typedef value_type* pointer;

在 c++ 20 之前,如果缺少任何迭代器类型定义,则

std::iterator_traits
是一个空类。在 c++20 之后
pointer
是可选的,这就是为什么升级到 c++20 允许您的代码编译

https://en.cppreference.com/w/cpp/iterator/iterator_traits

© www.soinside.com 2019 - 2024. All rights reserved.