C++ unordered_map::插入无法编译



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

声明:

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)     

错误消息对我来说没有意义 - 语法看起来是正确的。 谁能告诉我我做错了什么?

您正在尝试改变成员变量的const成员函数中。

使CProductSpecs::AddToMap不const

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

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

因此,您不能使用该函数来更改常量对象的数据成员。只有在使用存储类说明符mutable声明数据成员m_mffPhotoPeakMap的情况下,才能执行此操作。

解决方案是将 AddToMap(( 和 map 放入一个单独的类中,该类可以从 const 方法调用。

我找到了更好的解决方案:将映射声明为"可变",使其成为 const 属性的例外:

mutable unordered_map<float, float> m_mffPhotoPeakMap;

最新更新