2010-07-01 18 views
5

मैं एक रिवर्स इटेटरेटर संकलित करने की कोशिश कर रहा हूं लेकिन ऐसा करने के मेरे प्रयासों में एक गड़बड़ है। कोड के न्यूनतम उदाहरण है ...रिवर्स इटेटरेटर संकलित नहीं करेगा

#include <iostream> 
#include <vector> 
#include <algorithm> 

class frag { 
    public: 
     void print (void) const; 
    private: 
     std::vector<int> a; 
}; 

void frag::print (void) const 
{ 
    for (std::vector<int>::reverse_iterator iter = a.begin(); 
     iter         != a.end(); 
     ++iter) { 
     std::cout << *iter << std::endl; 
    } 
} 

और यह निम्नलिखित का उत्पादन संकलन करने का प्रयास ...

In file included from /usr/include/c++/4.4/bits/stl_algobase.h:69, 
      from /usr/include/c++/4.4/bits/char_traits.h:41, 
      from /usr/include/c++/4.4/ios:41, 
      from /usr/include/c++/4.4/ostream:40, 
      from /usr/include/c++/4.4/iostream:40, 
      from frag.cpp:1: 
/usr/include/c++/4.4/bits/stl_iterator.h: In constructor ‘std::reverse_iterator<_Iterator>::reverse_iterator(const std::reverse_iterator<_Iter>&) [with _Iter = __gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >, _Iterator = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >]’: 
frag.cpp:14: instantiated from here 
/usr/include/c++/4.4/bits/stl_iterator.h:134: error: no matching function for call to ‘__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(__gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >)’ 
/usr/include/c++/4.4/bits/stl_iterator.h:686: note: candidates are: __gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator(const _Iterator&) [with _Iterator = int*, _Container = std::vector<int, std::allocator<int> >] 
/usr/include/c++/4.4/bits/stl_iterator.h:683: note:     __gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator() [with _Iterator = int*, _Container = std::vector<int, std::allocator<int> >] 
/usr/include/c++/4.4/bits/stl_iterator.h:669: note:     __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&) 

कल इस विषय पर एक सवाल ही नहीं था, लेकिन मैं यह नहीं लगता कि यह एक टेम्पलेट नहीं है जैसा ही है। यदि एक वेक्टर स्थानीय रूप से इसी तरह घोषित किया जाता है तो यह काफी खुश है। (उबंटू 10.4 पर जी ++)।

कोई भी जानता है कि मुझे क्या करना चाहिए?

उत्तर

18

आप const_reverse_iterator उपयोग करने के लिए (print तो aconst है एक const समारोह है) और a.rbegin() और a.rend() बजाय begin() और end() की जरूरत है।

+0

डांग, कुछ मिनट जल्द ही :( – rubenvb

+0

@ रूबेनव: हालांकि मेरा पहला प्रयास केवल एक मुद्दा देखा गया है, दूसरे मुद्दे के साथ अद्यतन करने के लिए इसे संपादित किया गया है। –

+0

: डी कुछ प्रश्न भीड़ को आकर्षित करने लगते हैं, है ना? – rubenvb

2

आपको एक रिवर्स इटरेटर के लिए रिवर्स इटरेटर असाइन करना होगा। तुलना के साथ ही।

for (std::vector<int>::reverse_iterator iter = a.rbegin(); iter != a.rend(); ++iter); 

संपादित करें (पूर्णता के लिए) दूसरों के रूप में देखा है, const_reverse_iterator यहाँ भी जरूरी होगा: रिवर्स iterators तरीकों rbegin और rend का उपयोग कर प्राप्त किया जा सकता है।

+0

धन्यवाद; मैंने वास्तव में असली में यह गलती नहीं की थी कार्यक्रम, लेकिन मैं न्यूनतम उदाहरण में बहुत सी चीजों की कोशिश कर रहा था। –

3

दो चीजें हैं जो अपने कोड में एक मुद्दा कारण हो सकता है:

  1. आपका print() समारोह const घोषित किया जाता है, तो आप (शायद करने की जरूरत है या चाहिए) करेंगे एक const_reverse_iterator का उपयोग करें।

  2. आप एक normal_iterator (std::vector<T>::begin()) से एक reverse_iterator बना रहे हैं

+0

दूसरे बिंदु पर समस्या अंतिम तत्व पर इंगित नहीं कर रही है, लेकिन संपादन द्वारा संशोधित असंगत प्रकार 'normal_iterator' और' reverse_iterator' –

+0

असाइन करने और तुलना करने की तुलना नहीं कर रही है।धन्यवाद – rubenvb

1

ऊपर जवाब पहले से ही कहना है कि एक const_reverse_iteratorrbegin/rend साथ इस मामले में की जरूरत है।

कि के अलावा, एक अच्छा अभ्यास का उपयोग करने के crbegin या crend (में शुरू की सी ++ 11) स्पष्ट रूप से दर्शाते हैं कि आप print समारोह के बाद से इटरेटर का स्थिरांक संस्करण अनुरोध कर रहे हैं करने के लिए किया जाएगा स्थिरांक है।

संबंधित मुद्दे