C++ 简单迭代器:std::count错误
这是一个简单的练习。我想自己为一个C风格的字符数组编写一个自定义迭代器:无boost。我想我已经完成了一半,但在使用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
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) { };
// ......
};