C ++ unordered_map :: insert无法编译

时间:2019-11-26 20:17:51

标签: c++ const mutable

我只需要一个从一个浮动对象到另一个浮动对象的哈希映射。应该很简单,不是吗?编译器只是不接受它:

声明:

unordered_map<float, float> m_mffPhotoPeakMap;

使用:

float CProductSpecs::AddToMap(float fEnergy, float returnedValue) const
{
    auto pair = make_pair(fEnergy, returnedValue);
    m_mffPhotoPeakMap.insert(pair);                 // Error!  (First attempt)
    m_mffPhotoPeakMap[fEnergy] = returnedValue;     // Error!  (Second attempt)
    return returnedValue;
}

错误消息(首次尝试):

Severity    Code    Description Project File    Line    Suppression State
Error   C2663   'std::_Hash<std::_Umap_traits<_Kty,_Ty,std::_Uhash_compare<_Kty,_Hasher,_Keyeq>,_Alloc,false>>::insert': 6 overloads have no legal conversion for 'this' pointer

错误消息(第二次尝试):

Severity    Code    Description Project File    Line    Suppression State
Error   C2678   binary '[': no operator found which takes a left-hand operand of type 'const std::unordered_map<float,float,std::hash<float>,std::equal_to<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' (or there is no acceptable conversion)     

错误消息对我来说没有意义-语法似乎正确。谁能告诉我我在做什么错?

4 个答案:

答案 0 :(得分:8)

您正在使用const成员函数来尝试对成员变量进行突变。

使CProductSpecs :: AddToMap不能为const

答案 1 :(得分:3)

该函数被声明为常量非静态成员函数,

float CProductSpecs::AddToMap(float fEnergy, float returnedValue) const
                                                                  ^^^^^

因此,您可能无法使用该函数更改常量对象的数据成员。只有在使用存储类说明符m_mffPhotoPeakMap声明了数据成员mutable的情况下,您才能这样做。

答案 2 :(得分:0)

解决方案是将AddToMap()和地图放在单独的类中,可以从const方法中调用。

答案 3 :(得分:0)

我找到了一个更好的解决方案:将地图声明为“可变”,使其成为const属性的例外:

mutable unordered_map<float, float> m_mffPhotoPeakMap;