为什么std :: map <int,float =“”>不能使用operator []:错误C2678?</int,>

时间:2013-03-25 12:17:15

标签: c++ stl std

有:

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]时,我们得到元素值或默认元素值,所以我想知道这样的简单情况怎么会导致编译错误?

4 个答案:

答案 0 :(得分:7)

据推测,m_areaCostgetAreaCost所属对象的成员。但是,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仅作为示例,您可以返回适用于您的任何默认值。