2014-12-02 4 views
5

Я пытаюсь создать своего собственного переводчика. Это университетская работа. Мне нужен итератор в моем классе Translator.Iterator in 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

Кстати, вы можете захотеть назвать меньше вещей '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

Это больше комплемента, чем фактический ответ, но если вы хотите хороший итератор (СТЛ complient) вам также потребуется добавить несколько определений типов, к скажем, например, тип вашего итератора (в вашем случае у вас есть итератор ввода). Затем вы можете использовать свой итератор с любым алгоритмом 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