有:
std::map<const int, float> m_areaCost;
我正在尝试编译以下内容:
inline float getAreaCost(const int i) const {
return m_areaCost[i];
}
导致以下错误:
error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)
我曾经认为,当我们调用[elementId]
时,我们得到元素值或默认元素值,所以我想知道这样的简单情况怎么会导致编译错误?
答案 0 :(得分:7)
据推测,m_areaCost
是getAreaCost
所属对象的成员。但是,getAreaCost
被标记为const
成员函数。这意味着它不能对成员进行任何修改。因此m_areaCost
成员在此函数中为const
。
您无法在operator[]
上调用const std::map
,因为它的效果是如果新元素尚不存在则会插入新元素。而是使用std::map::at
:
return m_areaCost.at(i);
答案 1 :(得分:1)
因为你声明你的函数是const,而[]不是const运算符。 正如你自己所说,[]!创建或返回一个新值..如果它不能创建那么你就不能使用这个运算符..我会使用find()然后返回.second值,如果它在那里,像:
auto it = m_areaCost.find(i);
if (it != m_areaCost.end()) return (*it).second
答案 2 :(得分:0)
因为您将方法标记为const
。
执行return m_areaCost[i];
时,如果键不存在,您实际上可以在地图中创建条目,因此操作不是常数,因此您的常量函数和非常量{{1}之间不匹配地图。
如果您希望成员函数为operator[]
,则必须使用find
来查找密钥的条目。
答案 3 :(得分:0)
原因是getAreaCost
被声明为const
,与其他人一样,但我想提供更多建议:
函数应始终返回有用的值,因此我建议getAreaCost
为:
inline float getAreaCost(int i) const {
std::map<const int, float>::const_iterator It = m_areaCost.find(i);
if (It != m_areaCost.end()) return It->second;
return 0.0f;
}
有些观点:
1.输入参数是按值传递,因此不需要const int i
,只需使用int i
2.如果您发现std::map<const int, float>::const_iterator
之类的内容很详细,请给它typedef
。 (如果你不这样做,请随时写下来,当然:P)
3. 0.0f
仅作为示例,您可以返回适用于您的任何默认值。