2011-10-21 9 views
7

私はイテレーターとconst_iteratorクラス用の逆イテレーター・アダプターを実装するのに少し問題があります。誰かが私をこのように導くことができれば、それは大いに感謝されるでしょう!reverse_iteratorアダプター

アイデアは(私は私のrbeginから逆イテレータを作成することができるはずである)とレンド()関数は

reverse_iterator rbegin(); 
reverse_iterator rend(); 
const_reverse_iterator rbegin() const; 
const_reverse_iterator rend() const; 

を呼び出して、私はクラスに次のtypedefの使用しています:

typedef btree_iterator<T> iterator; 
typedef const_btree_iterator<T> const_iterator; 
typedef reverse_btree_iterator<iterator> reverse_iterator; 
typedef reverse_btree_iterator<const_iterator> const_reverse_iterator; 

ご覧のとおり、reverse_iteratorクラスにイテレータまたはconst_iteratorを指定して、テンプレートを使用して逆イテレータを作成できます。

残念ながら、それは私がこだわっているこのビット...以下

は、エラーのある私が現在持っているクラス定義は、されています。

template <typename I> class reverse_btree_iterator { 

    typedef ptrdiff_t      difference_type; 
    typedef bidirectional_iterator_tag iterator_category; 

public: 

    reverse_btree_iterator() : base_(I()) {} 
    template <typename T> reverse_btree_iterator(const btree_iterator<T>& rhs) : base_(rhs) {} 

    I base() { return base_; } 

    I::reference operator*() const; 
    I::pointer operator->() const; 
    I& operator++(); 
    I operator++(int); 
    I& operator--(); 
    I operator--(int); 
    bool operator==(const I& other) const; 
    bool operator!=(const I& other) const; 

private: 

    I base_; 

}; 

私は前に、このようなテンプレートを使ったことがないので、私はイテレータまたはconst_iteratorのことができますので、私は完全に彼らが...

を使用することができますどのように誤解しています非常に可能性があり、参照とポインタのtypedefは2つのクラスによって異なります。コンパイルされていない行は、これらは以下のとおりです。

I::reference operator*() const; 
I::pointer operator->() const; 

私は私を行うことができないんだ場合、私はイテレータとconst_iteratorの両方のための1つのreverse_iteratorクラスの作業を行うことができますどのように他わからない::参照し、 I ::ポインタ。あなたは

typename I::reference operator*() const; 
typename I::pointer operator->() const; 

を使用する必要がありますので、参照してポインタが、依存名で

typedef T*       pointer; 
typedef T&       reference; 
+1

+1。 –

+0

あなたが適応しようとしているconst_iteratorの 'const T *'と 'const T&'として定義されたArentポインタ/リファレンス? – gwiazdorrr

+0

'template'はかなり近いです。小道具 – Puppy

答えて

5

:として私はまた、彼らは(例えば)イテレータクラスで定義されているので、それらの前にテンプレートを追加してみましたさらに、コンストラクタはIだけを受け入れる必要があります。

しかし、このクラスを書く必要は全くありません。標準ライブラリにはreverse_iteratorがあります。あなたがそれに満足していない場合は、Boost.ReverseIteratorもあります。

それが取るすべての

はちょうど

typedef std::reverse_iterator<iterator> reverse_iterator; 
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 
+1

+1はstl :: reverse_iteratorを指しています。私ができるならば、私はもっと与えるだろう。 – Tomek

1

また、あなたは同じタイプの他のリバースイテレータと比較演算子を提供するのを忘れています。これは逆の反復子要件です。

関連する問題