2014-12-02 3 views
5

번역기를 직접 만들려고합니다. 그것은 대학 일입니다. 내 클래스에서 반복자가 필요합니다. 역자.C++의 반복자

class Translator 
{ 
private: 
    map <string,Word> translator; 

public: 
    class iterator 
    { 
     friend class Translator; 
     private: 
      map<string,Word>::iterator itm; 

     public: 
      iterator operator++(); 
      pair <string,Word> &operator*(); 
      bool operator==(const iterator &it)const; 
    }; 
}; 

과부하를 시도하고 있습니다. operator*();

이것은 코드입니다.

pair <string, Word>& Translator::iterator::operator*() 
{ 
    return (*itm); 
} 

에러 : 맵의

invalid initialization of reference of type ‘std::pair<std::basic_string<char>, Word>&’ from expression of type ‘std::pair<const std::basic_string<char>, Word>

+0

BTW, 당신은'translator' 적은 일을 호출 할 수 있습니다 : 여기

은 내가 준 링크에서 예입니다. 코드에 대한 이야기 ​​/ 추론을 쉽게하기. ;) – Yakk

답변

9

키는 상수이므로, 값 유형 pair<const string, Word>이다.

일부 유형의 별칭 코드가 친근 할 수 있습니다

typedef map <string,Word> map_type; 
typedef map_type::value_type value_type; 

value_type &operator*(); 
+0

대단히 감사합니다 !! 그것은 작동! – Maverick94

+0

이것은 작성하기가 상당히 쉬운 실수이며 형식을 명시 적으로 언급하지 않는 것이 좋은 예입니다. – Lionel

1

그것은 더 실제 대답보다는 보완하지만 (STL에 적합하게 대응) 멋진 반복자를 원한다면 당신은 또한에 여러 형식 정의를 추가해야합니다 예를 들어 반복자의 유형을 말하십시오 (귀하의 경우에는 입력 반복자가 있음). 그렇다면 매우 좋은 수있는 모든 stl 알고리즘을 사용하여 반복기를 사용할 수 있습니다. 그러나 이것은 상당히 번거로울 수 있습니다.

아주 좋은 접근 방식은 두 반복자는 등호와 역 참조하는 경우 테스트, 증가하는 방법을 지정하는 입력 반복자 세 가지 방법입니다 필요한 것을 다시 작성할 필요가 boost facade iterators을 사용하고 있습니다. 그러면 Boost가 더러운 작업을 수행하고 표준 호환 이터레이터로 모든 stl 알고리즘을 사용할 수 있습니다.

# include <boost/iterator/iterator_facade.hpp> 
# include "node.hpp" 
class node_iterator : public boost::iterator_facade< 
    node_iterator 
    , node_base 
    , boost::forward_traversal_tag 
>{ 
public: 
node_iterator() 
    : m_node(0) {} 

explicit node_iterator(node_base* p) 
    : m_node(p) {} 
private: 
friend class boost::iterator_core_access; 

void increment() { m_node = m_node->next(); } 

bool equal(node_iterator const& other) const 
{ 
    return this->m_node == other.m_node; 
} 

node_base& dereference() const { return *m_node; } 

node_base* m_node; 
}; 
+0

귀하의 제안이 일반적으로 유용 할 수도 있지만, 질문에 대답하지 않습니다. –

+0

당신이 맞습니다. 보충 정보입니다. 나는 "대답"을 편집했다. – geoalgo