32bit g++编译64位整数作为key的__gnu_cxx::hash_map的编译错误问题

来源:互联网 发布:佟大为演技 知乎 编辑:程序博客网 时间:2024/06/06 03:45

类似这样一段代码:

__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> {。。。。。};

}

原创粉丝点击