类似这样一段代码:
__gnu_cxx::hash_map<uint64_t, Obj> objs;
64bits的整数作为key的__gnu_cxx::hash_map, 原来一直在64bits的编译器下编译,一直好好的。有一次放到32bits的编译器下,产生一大堆乱七八糟的错误(模板编译错误提示太坑爹了)。问题出现在template<class _Key> struct hash{} 里面。
struct __gnu_cxx::hash{}偏特化了几种整数版本,包括char, short, int, long,以及上面4种unsigned版本,分析unsigned long的版本:
template <>
struct hash<unsigned long>
{
。。。。。
};
在64bits编译环境下, unsigned long是和uint64_t一致的, 而在32bits 的下面,就相当于uint32_t了。
解决的办法是,自己特化一个uint64_t的版本,类似
namespace __gnu_cxx
{
template <>
struct hash<uint64_t> {。。。。。};
}