2013-02-12 99 views
0

我正在學習boost :: iterator_facade。這是從一本書中的示例代碼:編譯boost :: iterator_facade錯誤

#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;} 
    }; 

這裏是測試代碼:

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; 
} 

不過,我得到以下編譯錯誤:

'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) 

於是,我就代替'reference'with step_iterator :: reference,這次我得到以下錯誤:

type 'step_iterator<I, 2>' is not derived from type 'step_iterator<I, N>' 

回答

1

您的取消引用函數需要返回對基礎序列元素的引用。

我會用std::iterator_traits<I>::reference,所以代碼看起來像:

typename std::iterator_traits<I>::reference dereference() const 
    { return *m_iter; } 
+0

謝謝!有用! – user957121 2013-02-14 03:56:36