map operator []操作数

时间:2010-05-05 10:05:16

标签: c++ map operands

大家好我在成员函数中有以下内容

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

以及成员变量的以下声明

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

但是编译时出现错误(英特尔编译器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>                                                                    ^

我知道这是愚蠢的事情,但我看不出我做错了什么。

UPDATE 我从const成员函数调用它,这就是为什么成员变量的类型是const所以我认为类似下面的内容应该修复它:

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

但没有骰子......仍然是同样的错误。

2 个答案:

答案 0 :(得分:22)

  

操作数类型是: const std :: map &lt; int ...

map::operator[]不适用于const map

answered这几天前。

  

map :: operator []有点奇怪。它   这样做:

     
      
  1. 找钥匙。
  2.   
  3. 如果找到,请将其退回。
  4.   
  5. 如果没有,请插入并默认构造其关联   值。
  6.   
  7. 然后返回对新值的引用。
  8.         

    第3步与constness不兼容。   而不是有两个   功能不同的运营商[]   超载,语言迫使你   使用map :: find for const objects。

答案 1 :(得分:6)

[]的原型是

 data_type& operator[](const key_type& k)

即。一个非const操作,所以你不能在const成员函数的成员上调用它。

您可以将代码更改为:

std::map<...>::const_iterator where = m_egressCandidatesByDestAndOtMode.find(tt);
if (egressCandidatesByDestAndOtMode.end() != where) {
    const vector<set<int>>& temp = where->second;
}