2010-05-05 41 views
9

Hi all Tôi có sau đây trong một hàm thành viênđồ operator [] toán hạng

int tt = 6; 
vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
set<int>& egressCandidateStops = temp.at(dest); 

và tuyên bố sau đây của một biến thành viên

map<int, vector<set<int>>> m_egressCandidatesByDestAndOtMode; 

Tuy nhiên tôi nhận được một lỗi khi biên dịch (Intel Compiler 11.0)

1>C:\projects\svn\bdk\Source\ZenithAssignment\src\Iteration\PtBranchAndBoundIterationOriginRunner.cpp(85): error: no operator "[]" matches these operands 
1>   operand types are: const std::map<int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>, std::less<int>, std::allocator<std::pair<const int, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>>>> [ const int ] 
1>   vector<set<int>>& temp = m_egressCandidatesByDestAndOtMode[tt]; 
1>                 ^

Tôi biết đó là điều gì đó ngớ ngẩn nhưng tôi không thể nhìn thấy những gì tôi đã làm sai.

CẬP NHẬT Tôi gọi này từ một hàm thành viên const đó là lý do loại các biến thành viên là const vì vậy tôi nghĩ rằng một cái gì đó như sau nên sửa chữa nó:

int dest = 0, tt = 6; 
const set<int>& egressCandidateStops = m_egressCandidatesByDestAndOtMode[tt].at(dest); 

Nhưng không có con xúc xắc .. vẫn là lỗi tương tự.

+0

Câu trả lời từ Potatoswatter là đúng. Để tránh vấn đề của bạn, bạn cần phải sử dụng tìm. – fulmicoton

Trả lời

20

loại toán hạng là: const std :: map < int ...

map::operator[] không làm việc với một const map.

I answered cách đây vài ngày trước.

bản đồ :: toán tử [] hơi lạ. Nó thực hiện điều này:

  1. Tìm chìa khóa.
  2. Nếu tìm thấy, hãy trả lại.
  3. Nếu không, hãy chèn nó và xây dựng mặc định giá trị được liên kết của nó.
  4. Sau đó trả lại tham chiếu đến giá trị mới.

Bước 3 không tương thích với constness. Thay vì có hai toán tử hoạt động khác nhau [] quá tải, ngôn ngữ buộc bạn phải sử dụng bản đồ :: tìm đối tượng const.

+0

Thats chính xác nó !! Tôi sẽ đánh dấu là trả lời trong bảy phút, không biết tại sao tôi không thể ... nếu câu trả lời là đúng, nó đúng :) –

+0

Có lẽ đáng nói đến 'std :: map :: at' ngay bây giờ. – juanchopanza

5

Nguyên mẫu cho []

data_type& operator[](const key_type& k) 

tức là hoạt động const thuốc, vì vậy bạn không thể gọi nó trên một thành viên từ một hàm thành viên const.

Bạn có thể thay đổi mã để:

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt); 
if (egressCandidatesByDestAndOtMode.end() != where) { 
    const vector<set<int>>& temp = where->second; 
} 
Các vấn đề liên quan