0

私は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)

そこで、「参照」を step_iterator::reference に置き換えようとしましたが、今回は次のエラーが発生します。

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

1 に答える 1

1

逆参照関数は、基になるシーケンスの要素への参照を返す必要があります。

を使用するstd::iterator_traits<I>::referenceので、コードは次のようになります。

    typename std::iterator_traits<I>::reference dereference() const  
    {   return *m_iter; }
于 2013-02-12T15:34:29.503 に答える