2013-02-12 4 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' с помощью 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

Смежные вопросы