2014-12-02 23 views
5

Kendi çevirmenimi oluşturmaya çalışıyorum. Üniversite çalışması. Benim çevirmenimdeki bir yineleyiciye ihtiyacım var.C++ içinde yineleyici

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

Yüklemeye çalışıyorum operator*();

Bu koddur.

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

Hata: Bir haritanın

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' az şey diyebilirsin: Burada

Sana verdiğim bağlantıdan bir örnektir. Sadece kodunuz hakkında daha kolay konuşmak/muhakeme yapmak. ;) – Yakk

cevap

9

tuşları sabittir, bu yüzden değer türü pair<const string, Word> olduğunu.

Bazı tip adlar kod dostça hale getirebileceğini:

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

value_type &operator*(); 
+0

çok teşekkür ederim! İşe yarıyor !! – Maverick94

+0

Bunu yapmak oldukça kolay bir hatadır ve açık bir şekilde tavsiye edilmediğini belirttiğinizde iyi bir örnektir. – Lionel

1

Daha bir yanıtın kendisinden bir tamamlayıcısı ama (STL uyumluydu) güzel bir yineleyici isterseniz ayrıca, çeşitli typedefs eklemeniz gerekecektir Örneğin yineleyicinizin türü (sizin durumunuzda bir giriş yineleyiciniz var). Sonra yineleyicinizi çok hoş olabilecek herhangi bir stl algoritmasıyla kullanabilirsiniz. Ancak bu oldukça hantal olabilir.

Çok güzel bir yaklaşım boost facade iterators kullanıyor, sadece ne yineleme, iki yineleyici eşittir ve eşittir, belirten bir giriş yineleyici için üç yöntem olan gerekli olanları yeniden yazmanız gerekir. Boost, tüm kirli işleri sizin için yapıyor ve daha sonra tüm stl algoritmalarını standart uyumlu yineleyicilerle kullanabilirsiniz.

# 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

Öneriniz genelde yararlı olsa da, bu soru –

+0

cevabını vermez. Haklısınız, tamamlayıcı bilgilerdir. "Cevabımı" düzenledim. – geoalgo