2011-10-21 3 views
7

약간의 문제가있는 iterator 및 const_iterator 클래스의 역방향 반복기 어댑터를 구현하려고합니다. 누군가가 이것을 통해 나를 인도 할 수 있다면 크게 환영 할 것입니다!reverse_iterator adapter

:

아이디어는 내가 (내 rbegin에서 역 반복자를 생성 할 수 있어야한다) 및 렌드() 함수 나 클래스에 다음과 같은 형식 정의의의를 사용하고

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

를 호출하는 것입니다

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를 만들 수 있고 reverseeriter 클래스에 iterator 또는 const_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_; 

}; 

것은

... 내가 전에 다음과 같은 템플릿을 사용한 적이, 그래서 나는 완전히 그들이 사용할 수있는 방법을 오해하고있어 가능성이 매우 높다 참조와 포인터의 typedef는 두 클래스간에 다양합니다. 컴파일되지 않은 라인은 다음과 같습니다

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

내가 I를 할 :: 참조를 할 수 아니에요 만약 내가 반복자와 const_iterator를 모두 하나의 reverse_iterator 수준의 작업을 할 수있는 방법 다른 모르겠어요 및 I :: 포인터. 그들은으로 (예를 들어) 반복자 클래스에 정의되어 있기 때문에 나는 또한 그 앞에 템플릿을 추가하는 시도 :

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

+1 용감성. –

+0

적응하려고하는 const_iterator의'const T *'와'const T &'로 정의 된 Arent 포인터/참조? – gwiazdorrr

+0

'template'는 꽤 가깝습니다. 소품. – 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을 stl :: reverse_iterator로 지정합니다. 나는 할 수 있으면 더 줄 것입니다. – Tomek

1

또한, 같은 유형의 다른 역 반복자와 비교 연산자를 제공하는 것을 잊었다입니다. 반대로 반복자 요구 사항입니다.

관련 문제