2011-10-21 15 views
7

मैं अपने पुनरावर्तक और const_iterator कक्षाओं के लिए एक उलटी गलती के साथ एक रिवर्स-इटरेटर एडाप्टर को कार्यान्वित करने की कोशिश कर रहा हूं। अगर कोई मुझे इस माध्यम से मार्गदर्शन कर सकता है, तो इसकी सराहना की जाएगी!रिवर्स_इटरेटर एडाप्टर

विचार यह है कि मैं) उखड़ना() फ़ंक्शन

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

कॉल मैं निम्नलिखित typedef का उपयोग कर रहा हूँ कक्षा में मेरी rbegin से एक रिवर्स-इटरेटर बनाने के लिए सक्षम होना चाहिए (और:

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; 

जैसा कि आप देख सकते हैं, मैं टेम्पलेट्स का उपयोग कर रिवर्स-इटरेटर बनाने में सक्षम होना चाहता हूं, रिवर्स_इटरेटर क्लास या तो इटरेटर या कॉन्स्ट_इटरेटर देता हूं।

दुर्भाग्य से, यह इस बिट मैं पर अटक कर रहा हूँ ...

नीचे है वर्ग परिभाषा मैं वर्तमान में है, त्रुटियों के साथ है।

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

}; 

मैं इस तरह का उपयोग किया है कभी नहीं टेम्पलेट्स से पहले, तो यह बहुत संभव है मैं पूरी तरह से गलत समझ रहा हूँ कि वे किस तरह इस्तेमाल किया जा सकता है ...

जब से मैं एक iterator या एक const_iterator, हो सकता है संदर्भ और सूचक के टाइपपीफ दो वर्गों के बीच भिन्न होता है। लाइनों है कि संकलन नहीं कर रहे हैं ये हैं:

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

मैं और यह सुनिश्चित करें और कैसे मैं दोनों इटरेटर और const_iterator के लिए एक reverse_iterator वर्ग काम कर सकते हैं, तो मुझे लगता है मैं क्या करने के लिए :: संदर्भ में सक्षम नहीं कर रहा हूँ नहीं कर रहा हूँ मैं सूचक ::। मैं भी उन के सामने टेम्पलेट जोड़ने की कोशिश की है, क्योंकि वे के रूप में इटरेटर वर्ग (उदाहरण के लिए) में परिभाषित कर रहे हैं:

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

+1। –

+0

एंटेंट पॉइंटर/संदर्भ 'कॉन्स्ट टी *' के रूप में परिभाषित किया गया है और कॉन्स्ट_इटरेटर में 'कॉन्स्ट टी एंड' जिसे आप अनुकूलित करने की कोशिश कर रहे हैं? – gwiazdorrr

+0

'टेम्पलेट 'बहुत करीब है। रंगमंच की सामग्री। Stl :: reverse_iterator को इंगित करने के लिए – Puppy

उत्तर

5

संदर्भ और सूचक निर्भर नाम हैं, तो आप

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

उपयोग करने के लिए इसके अलावा, निर्माता को केवल I स्वीकार करना चाहिए।

हालांकि, इस कक्षा को बिल्कुल लिखने की कोई आवश्यकता नहीं है। इसके लिए मानक पुस्तकालय में reverse_iterator है। या यदि आप इससे खुश नहीं हैं, तो Boost.ReverseIterator भी है।

सभी यह लेता है सिर्फ

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

+1। अगर मैं कर सकता तो मैं और अधिक दे दूंगा। – Tomek

1

इसके अलावा, आप एक ही प्रकार के अन्य रिवर्स iterators के साथ तुलना ऑपरेटरों प्रदान करने के लिए भूल गया है। यह एक रिवर्स इटेटरेटर आवश्यकता है। बहादुरी के लिए