大家好我在成员函数中有以下内容
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);
但没有骰子......仍然是同样的错误。
答案 0 :(得分:22)
操作数类型是: const std :: map &lt; int ...
map::operator[]
不适用于const map
。
我answered这几天前。
map :: operator []有点奇怪。它 这样做:
- 找钥匙。
- 如果找到,请将其退回。
- 如果没有,请插入并默认构造其关联 值。
- 然后返回对新值的引用。
醇>第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;
}