2013-03-27 25 views
6

này thất bại trong việc biên dịch trong gcc 4.1.2/RedHat 5:lỗi: không phù hợp cho 'operator []' trong ... <near match>

#include <string> 
#include <vector> 
#include <map> 

class Toto { 
public: 
    typedef std::string SegmentName; 
}; 

class Titi { 
public: 
    typedef Toto::SegmentName SegmentName; // import this type in our name space 
    typedef std::vector<SegmentName> SegmentNameList; 
    SegmentNameList segmentNames_; 
    typedef std::map<SegmentName, int> SegmentTypeContainer; 
    SegmentTypeContainer segmentTypes_; 

    int getNthSegmentType(unsigned int i) const { 
     int result = -1; 

     if(i < segmentNames_.size()) 
     { 
      SegmentName name = segmentNames_[i]; 
      result = segmentTypes_[ name ]; 
     } 
     return result; 
    } 
}; 

Lỗi này là:

error: no match for 'operator[]' in '(...)segmentTypes_[name]' 
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_map.h:340: 
note: candidates are: _Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) 
[with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = int, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> >] 

Tại sao ? Bản đồ khá đơn giản. Tôi đoán điều này đã làm với typedefs, nhưng những gì là sai?

[sửa] Ngay cả khi tôi xóa tất cả các typedefs và sử dụng std::string ở khắp mọi nơi, sự cố vẫn tiếp diễn ... Tôi có sử dụng sai bản đồ không?

Trả lời

15

std::map::operator[] không cố định và bạn đang cố gắng sử dụng phương thức này từ phương thức const.

Bạn có thể đạt được điều này bằng std::map::find, mà trả về một const_iterator:

SegmentTypeContainer::const_iterator iter = segmentTypes_.find(name); 

Nếu bạn đang sử dụng C++ 11, bạn cũng có thể sử dụng std::map::at, mà sẽ ném một ngoại lệ nếu phím không được tìm thấy trong bản đồ:

result = segmentTypes_.at(name); 
+0

Hoặc 'at' trong C++ 11. +1 –

+0

@LuchianGrigore Tôi chắc chắn 'at' đã tồn tại trước khi C++ 11 – Saage

+0

@Saage chỉ làm phần mở rộng. Bây giờ nó là tiêu chuẩn. – juanchopanza

11

std::map::operator[] không phải là một phương pháp const, nhưng bạn đang gọi nó từ một phương pháp const của lớp học của bạn. Lý do cho điều này là nó thêm một phần tử nếu khóa không có.

Bạn có thể sử dụng C++ 11 at():

result = segmentTypes_.at(name); // throws exception if key not present. 

hoặc sử dụng std::map::find.

SegmentTypeContainer::const_iterator it = segmentTypes_.find(name); 
if (it != segmentTypes_.end()) 
{ 
    // OK, element with key name is present 
    result = it->second; 
} 
Các vấn đề liên quan