C++ 简单迭代器:std::count错误

C++ 简单迭代器:std::count错误,c++,c++11,iterator,C++,C++11,Iterator,这是一个简单的练习。我想自己为一个C风格的字符数组编写一个自定义迭代器:无boost。我想我已经完成了一半,但在使用std::count时出现了一个错误 我的迭代器是: class myIterator : std::iterator<std::input_iterator_tag, char> { char *p; public: // Definitions typedef typename std::iterator<std::input_it

这是一个简单的练习。我想自己为一个C风格的字符数组编写一个自定义迭代器:无boost。我想我已经完成了一半,但在使用
std::count
时出现了一个错误

我的迭代器是:

class myIterator : std::iterator<std::input_iterator_tag, char>
{
    char *p;

public:

    // Definitions
    typedef typename std::iterator<std::input_iterator_tag, char>::difference_type difference_type;
    typedef typename std::iterator<std::input_iterator_tag, char>::value_type value_type;
    typedef typename std::iterator<std::input_iterator_tag, char>::reference reference;
    typedef typename std::iterator<std::input_iterator_tag, char>::pointer pointer;

    // Implementation
    myIterator(char* x) :p(x) { };
    myIterator(const myIterator& i) : p(i.p) { };
    myIterator& operator++() { ++p; return *this; };
    myIterator operator++(int) {myIterator tmp(*this); operator++(); return tmp; };
    bool operator==(const myIterator& rhs) { return p == rhs.p; };
    bool operator!=(const myIterator& rhs) { return p != rhs.p; };
    char& operator*() { return *p; };
};
但是,这会导致编译时错误:

std::cout << std::count(data.begin(), data.end(), '@') << std::endl;
我在这里遗漏了一些东西:我在迭代器中声明了
difference\u type


有人能帮忙吗?

std::iterator
派生类已经定义了
value\u-type
difference\u-type
等,所以不应该定义它们。只要将您的继承公开并删除那些
typedef
s,它就会工作:

class myIterator : public std::iterator<std::input_iterator_tag, char>
{
    char *p;

public:
    // Implementation
    myIterator(char* x) :p(x) { };
    // ......
};
类myIterator:public std::iterator { char*p; 公众: //实施 myIterator(char*x):p(x){}; // ...... }; 请注意,没有必要删除
typedef
s,但是没有理由手动定义它们,
std::iterator
已经这样做了


演示。

std::iterator
派生类已经定义了
值类型
差异类型
,等等。所以不应该定义它们。只要将您的继承公开并删除那些
typedef
s,它就会工作:

class myIterator : public std::iterator<std::input_iterator_tag, char>
{
    char *p;

public:
    // Implementation
    myIterator(char* x) :p(x) { };
    // ......
};
类myIterator:public std::iterator { char*p; 公众: //实施 myIterator(char*x):p(x){}; // ...... }; 请注意,没有必要删除
typedef
s,但是没有理由手动定义它们,
std::iterator
已经这样做了


演示。

我不确定这是否是问题所在,但使用
std::iterator
将从它公开继承。还是不使用 并定义其所有五个typedef。我猜原因是什么 您的代码不起作用的原因是
iterator\u类别的typedef
不可访问:如果您不是从
std::iterator
,您必须提供它

值得一提的是,有三种方法可以使 迭代器类型符合:从
std::iterator
公开继承, 声明五个typedef(
value\u type
difference\u type
指针
引用
迭代器(类别
)直接在 类(作为公共类),或专门化 类(同样,使用五个typedef)。第一个是目前为止最重要的
最简单也是最常见的

我不确定这是否是问题所在,但通常的使用方法是
std::iterator
将从它公开继承。还是不使用 并定义其所有五个typedef。我猜原因是什么 您的代码不起作用的原因是
iterator\u类别的typedef
不可访问:如果您不是从
std::iterator
,您必须提供它

值得一提的是,有三种方法可以使 迭代器类型符合:从
std::iterator
公开继承, 声明五个typedef(
value\u type
difference\u type
指针
引用
迭代器(类别
)直接在 类(作为公共类),或专门化 类(同样,使用五个typedef)。第一个是目前为止最重要的
最简单也是最常见的

如果他重复所有的typedef,他的解决方案也会起作用。他忘记了一个重要的问题:
iterator\u category
。该死,我希望我能使用非公共继承。“你认为有可能避免在公众场合露面吗?”詹姆斯坎泽:是的,你是对的。但是,他应该继承std::iterator或编写typedefs,而不是两者兼而有之。此外,这就是std::iterator的全部要点。@senseiwa为什么不在这里使用公共继承?@mfontani我想没有什么特别的原因。我只是想使用
std::iterator
作为“实现为”,但我也可以使用“is-a”。如果他重复所有的typedef,他的解决方案也会起作用。他忘记了一个重要的问题:
iterator\u category
。该死,我希望我能使用非公共继承。“你认为有可能避免在公众场合露面吗?”詹姆斯坎泽:是的,你是对的。但是,他应该继承std::iterator或编写typedefs,而不是两者兼而有之。此外,这就是std::iterator的全部要点。@senseiwa为什么不在这里使用公共继承?@mfontani我想没有什么特别的原因。我只是想使用
std::iterator
作为“实现为”,但我也可以使用“is-a”。
class myIterator : public std::iterator<std::input_iterator_tag, char>
{
    char *p;

public:
    // Implementation
    myIterator(char* x) :p(x) { };
    // ......
};