reinterpret_cast <unsigned long =“”>无效转换</unsigned>

时间:2014-08-30 19:21:21

标签: c++ c++11 stl

我正在使用C ++中的Hashtable。哈希函数:

// Default hash function class
template <typename K>
struct KeyHash {
    unsigned long operator()(const K& key) const {
        return reinterpret_cast<unsigned long>(key) % TABLE_SIZE;
    }
};

然后当我声明哈希表为:

HashTable<int, std::string> hmap;

显示:

  

来自&#39; int&#39;的无效演员表输入&#39; unsigned_long_int&#39;

这里的reinterpret_cast<unsigned long>问题是什么?

2 个答案:

答案 0 :(得分:5)

您可以在两个整数类型(句点)之间reinterpret_cast。这不是reinterpret_cast的用途。如果要在两种整数类型之间进行转换,请使用static_cast

如果您的目标是真正&#34;重新解释比特模式&#34;然后你必须转向引用。也就是说,如果reinterpret_cast<unsigned long&>(x)是类型x的左值,则int有效。但是现在你进入危险区域,因为这通常是未定义的行为,并且可能在32位x86平台上工作,但是在unsigned long长于int的64位x86平台上会做坏事。 {1}}。

答案 1 :(得分:2)

根据C ++标准(5.2.10 Reinterpret cast)

  

2 reinterpret_cast运算符不应丢弃constness   (5.2.11)。 整数,枚举,指针或的表达式   指向成员的类型可以显式转换为自己的类型;   这样的转换会产生其操作数的值。

改为使用static_cast