2014-12-02 14 views
5

Tôi đang cố tạo trình dịch của riêng mình. Đó là công việc đại học. Tôi cần một iterator trong lớp của tôi 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; 
    }; 
}; 

Tôi đang cố gắng quá tải operator*();

Đây là mã.

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

Lỗi:

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, bạn có thể muốn gọi điều ít 'translator'. Chỉ cần để nói chuyện/lý luận về mã của bạn dễ dàng hơn. ;) – Yakk

Trả lời

9

Các phím của bản đồ là hằng số, vì vậy các kiểu giá trị là pair<const string, Word>.

Một số bí danh loại có thể làm cho đoạn code thân thiện hơn:

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

value_type &operator*(); 
+0

cảm ơn bạn rất nhiều !! Nó hoạt động !! – Maverick94

+0

Đây là một sai lầm khá dễ dàng để thực hiện và là một ví dụ tốt khi đề cập rõ ràng loại không được khuyến khích. – Lionel

1

Nó là nhiều hơn một sự bổ sung hơn một câu trả lời thực tế nhưng nếu bạn muốn có một iterator đẹp (STL complient), bạn cũng sẽ cần phải thêm nhiều typedefs, để ví dụ như loại trình lặp của bạn (trong trường hợp của bạn, bạn có một trình lặp đầu vào). Sau đó, bạn có thể sử dụng trình lặp của bạn với bất kỳ thuật toán stl nào có thể rất đẹp. Tuy nhiên điều này có thể khá cồng kềnh.

Cách tiếp cận rất đẹp là sử dụng boost facade iterators, bạn chỉ cần viết lại những gì cần thiết là ba phương thức cho trình lặp đầu vào xác định cách tăng, kiểm tra nếu hai trình lặp là bằng và dereference. Boost là sau đó làm tất cả các công việc bẩn cho bạn và sau đó bạn có thể sử dụng tất cả các thuật toán stl với iterators tuân thủ tiêu chuẩn của bạn.

Dưới đây là một ví dụ từ liên kết Tôi đưa cho bạn:

# 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

Mặc dù đề xuất của bạn có thể hữu ích nói chung, nhưng nó không trả lời câu hỏi –

+0

Bạn nói đúng hơn là thông tin bổ sung. Tôi đã chỉnh sửa "câu trả lời" của tôi. – geoalgo