2014-08-30 41 views
0

我正在使用C++中的散列表。散列函數:reinterpret_cast <unsigned long>無效的投射

// 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; 

其顯示:

從 '廉政' 類型 'unsigned_long_int'

無效的轉換

這裏有什麼問題reinterpret_cast<unsigned long>

+0

也許是'sizeof(unsigned long)!= sizeof(int)',所以「重新解釋位模式」可能沒有意義......我不確定。 – 2014-08-30 19:25:42

+0

這個****是誰給的那個downvote?所以每個人都不會像你一樣瞭解所有事情。 – 2014-08-30 19:27:55

+0

看來你是在假設我給了你那個downvote。我沒有。 [證明](http://imgur.com/2tey48m)。 – 2014-08-30 19:29:39

回答

4

您不能reinterpret_cast兩個整數類型之間的句點。這不是reinterpret_cast。如果要在兩個整數類型之間進行轉換,請使用static_cast

如果你的目標是真正「重新解釋位模式」,那麼你必須投到參考。即如果xint類型的左值,則reinterpret_cast<unsigned long&>(x)有效。但是現在你正在進入危險區域,因爲這通常是未定義的行爲,並且可能在32位x86平臺上工作,但是在64位x86平臺上,unsigned long長於int會做一些壞事。

+0

+1和AC爲一個很好的答案,而不是投降我(人們沒有理由):) – 2014-08-30 19:39:59

+0

訪問'reinterpret_cast (x)'的值是_always_ UB;演員只在語法上有效。 – ildjarn 2014-08-30 19:58:59

+0

它總是UB,但它仍然可能在某些實現上表現可預測,就像所有的UB一樣。 – Brian 2014-08-30 20:09:11

2

根據C++標準(5.2.10重釋鑄造)

2 reinterpret_cast運算符不應拋棄常量性 (5.2.11)。 指針到成員類型的整數,枚舉,指針或表達式可以顯式轉換爲其自己的類型; 這樣的演員會產生其操作數的值。

改爲使用static_cast

+0

+1,但其他人已經被接受了,先生:) – 2014-08-30 19:41:37

相關問題