Reverse_Artist Adapter

I am trying to implement a reverse iterator adapter for my iterator and const_iterator classes with little problems. If anyone could guide me through this, that would be very helpful!

The idea is that I should be able to create a reverse iterator from my rbegin () and rend () functions

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

I use the following typedef type in the class:

 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; 

As you can see, I would like to be able to create reverse iterators using templates, providing the reverse_iterator class to either an iterator or const_iterator.

Sorry, this bit I'm stuck ...

The following is the class definition that I have with errors.

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

I have never used templates before, so most likely I don’t completely understand how they can be used ...

Since I can be an iterator or const_iterator, the typedef of the reference and pointer differ between the two classes. The lines that do not compile are as follows:

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

I'm not sure how else I can make one reverse_iterator class for an iterator and const_iterator if I cannot execute I :: reference and I :: pointer. I also tried adding a pattern in front of them, as they are defined in the iterator class (for example) as:

 typedef T* pointer; typedef T& reference; 
+7
source share
2 answers

link and pointer are dependent names, so you should use

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

In addition, the constructor should only accept I

However, there is no need to write this class at all. For this standard library reverse_iterator . Or, if that doesn't suit you, also Boost.ReverseIterator .

All it takes is just

 typedef std::reverse_iterator<iterator> reverse_iterator; typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 
+5
source

In addition, you forgot to provide comparison operators with other inverse iterators of the same type. This is a reverse iterator requirement.

+1
source

All Articles