这是我的代码:
#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容器。
typedef value_type* pointer_type;
应该是
typedef value_type* pointer;
在 c++ 20 之前,如果缺少任何迭代器类型定义,则
std::iterator_traits
是一个空类。在 c++20 之后 pointer
是可选的,这就是为什么升级到 c++20 允许您的代码编译