使用了一个unordere_map类,采取自定义类型的的key和自定义的hash函数,编译报错,代码如下:
#include<unordered_map>
struct key
{
int _i;
int _f;
bool operator== (const key& p) const
{
return _i == p._i && _f == p._f;
}
};
struct value
{
int _i;
float _f;
double _d;
};
struct hash_name
{
size_t operator () (const key &k)
{
return std::hash<int>()(k._i) ^ std::hash<int>()(k._f);
}
};
int main()
{
std::unordered_map<key, value, hash_name> _unordered_map;
key k;
value v;
_unordered_map.insert(std::pair<key, value>(k, v));
return 0;
}
因为使用了hash_name仿函数,原型如下:
size_t operator()(const _Kty& _Keyval) const
{ // hash _Keyval to size_t value
return ((size_t)_Gethash()(_Keyval));
}
该函数有限定符const,编译时,由于hash_name 重载操作符‘()’未加const函数限定符(函数只读限定),导致不匹配,编译时检测出错误,可以将hash_name改为
struct hash_name
{
size_t operator () (const key &k) const
{
return std::hash<int>()(k._i) ^ std::hash<int>()(k._f);
}
};
即可编译通过
微软的官方解释: