[英]Compile errors on boost::iterator_facade
I'm learning boost::iterator_facade. 我正在学习boost :: iterator_facade。 Here is an example code from a book:
这是一本书的示例代码:
#include <iostream>
#include <boost/iterator/iterator_facade.hpp>
template<typename I,std::ptrdiff_t N = 2>
class step_iterator:
public boost::iterator_facade<
step_iterator<I>,
typename boost::iterator_value<I>::type const,
boost::single_pass_traversal_tag>
{
private:
I m_iter;
public:
step_iterator(I x) :
m_iter(x){}
step_iterator(step_iterator const& other):
m_iter(other.m_iter){}
void operator=(step_iterator const& other)
{ m_iter = other.m_iter; }
private:
friend class boost::iterator_core_access;
reference dereference() const
{ return *m_iter; }
void increment()
{ std::advance(m_iter,N); }
bool equal(step_iterator const& other) const
{ return m_iter == other.m_iter;}
};
Here is the test code: 这是测试代码:
int main()
{
char s[] = "12345678";
std::copy(s,s+8,
std::ostream_iterator<char>(cout));
cout<<endl;
step_iterator<char*> first(s),last(s+8);
std::copy(first,last,
std::ostream_iterator<char>(cout));
return 0;
}
However, I get the following compile error: 但是,出现以下编译错误:
'reference' does not name a type
(perhaps 'typename boost::iterator_facade<step_iterator<I, 2>, const typename boost::iterator_value<Iterator>::type, boost::single_pass_traversal_tag, const typename boost::iterator_value<Iterator>::type&, int>::reference' was intended)
So I tried to replace 'reference' with step_iterator::reference, this time I get the following error: 所以我试图用step_iterator :: reference替换'reference',这次我得到以下错误:
type 'step_iterator<I, 2>' is not derived from type 'step_iterator<I, N>'
Your dereference function needs to return a reference to an element of the underlying sequence. 您的取消引用函数需要返回对基础序列元素的引用。
I would use std::iterator_traits<I>::reference
, so the code would look like: 我将使用
std::iterator_traits<I>::reference
,因此代码如下所示:
typename std::iterator_traits<I>::reference dereference() const
{ return *m_iter; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.