2011-10-21 14 views
7

Yineleyici ve const_iterator sınıfları için bir sorun çözücü adaptörünü biraz sorunla uygulamaya çalışıyorum. Eğer bu konuda bana yol gösterebilecek biri varsa, bu çok takdir edilecektir!reverse_iterator bağdaştırıcısı

:

fikri (benim rbegin gelen bir ters-yineleyici oluşturmak mümkün olmalıdır) ve parçalamak() işlevi sınıfta aşağıdaki typedef 's kullanıyorum

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

çağırır olmasıdır

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; 

Gördüğünüz gibi, reverse_iterator sınıfını bir yineleyici veya const_iterator veren şablonlar kullanarak ters yineleyiciler oluşturabilmek istiyorum.

Ne yazık ki, ben şaşırıp bu biraz ... Aşağıda

hataları ile şu anda var sınıf tanımı, olmasıdır. Bir yineleyici ya da const_iterator olabilir beri

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

}; 

... Daha önce böyle şablonları hiç kullanmadıysanız, yüzden ben tamamen onlar nasıl kullanılabileceğini yanlış anlama ediyorum çok muhtemeldir Referans ve işaretçi typedef iki sınıf arasında değişir. derleme olmayan hatlar şunlardır:

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

Ben I yapmak :: referansı mümkün değilim ben yineleyici ve const_iterator ikisi için bir reverse_iterator sınıfı uygulayabiliriz başka nasıl emin değilim ve Ben işaretçi ::. onlar (örneğin) iterasyon sınıfında tanımlanır çünkü, aynı zamanda, bu ön şablonu ilave çalıştı:

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

+1. –

+0

Arızalı işaretçi/başvuru const_iterator'da const Tite ve const Tite 'olarak tanımlandı mı? – gwiazdorrr

+0

'template' oldukça yakın. Dikmeler. Stl :: reverse_iterator öğesine işaret etmek için – Puppy

cevap

5

referans ve işaretçi bağımlı isimler, bu yüzden

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

kullanmak zorunda Ayrıca, kurucu sadece I kabul etmelidir. Bununla birlikte, bu dersi hiç yazmaya gerek yoktur. Standart kitaplık bunun için reverse_iterator vardır. Ya da bundan memnun değilseniz, Boost.ReverseIterator da var.

Tek gereken

sadece

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

+1. Yapabilirsem daha çok veririm. – Tomek

1

Ayrıca, aynı türdeki diğer ters adım adım elde karşılaştırma operatörlerini sağlamak unuttum olduğunu. Bu bir ters yineleyici gereksinimidir. Cesaret için

İlgili konular