1

有:

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

4 回答 4

7

想必m_areaCost是对象的成员即getAreaCost是成员。但是,getAreaCost被标记为const成员函数。这意味着它不会对成员造成任何修改。所以m_areaCost成员const在这个函数中。

你不能调用operator[]a const std::map,因为它的效果是如果它还不存在,它会插入一个新元素。而是使用std::map::at

return m_areaCost.at(i);
于 2013-03-25T12:19:27.257 回答
1

因为您声明您的函数是 const,而 [] 不是 const 运算符。正如您自己所说的那样, [] !创建或返回一个新值..如果它无法创建,那么您不能使用此运算符..我将使用 find() 然后返回 .second 值(如果存在),例如:

auto it = m_areaCost.find(i);
if (it != m_areaCost.end()) return (*it).second
于 2013-03-25T12:19:14.197 回答
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只是举例,您可以返回任何适合您情况的默认值。

于 2013-03-29T15:58:48.277 回答
0

因为您将方法标记为const.

当您这样做时return m_areaCost[i];,如果键不存在,您实际上可以在映射中创建条目,因此操作不是常量,因此您的常量函数和operator[]映射的非常量之间存在不匹配。

如果您希望成员函数成为,const那么您必须使用find来查找键的条目。

于 2013-03-25T12:20:12.117 回答