2014-08-30 4 views
0

Я работаю с Hashtable на C++. Хэш-функция:reinterpret_cast <unsigned long> Invalid Cast

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

Его показ:

Invalid литая от типа 'Int' в 'unsigned_long_int'

В чем проблема с reinterpret_cast<unsigned long>?

+0

Может быть, это 'sizeof (unsigned long)! = Sizeof (int)', поэтому «переинтерпретировать бит-шаблон» может не иметь смысла ... Я не уверен, хотя. –

+0

Кто этот **** дает этот downvote? Все в SO не знают все, как вы. –

+0

Кажется, вы предполагаете, что я дал вам это нисходящее. Я этого не сделал. [Доказательство] (http://imgur.com/2tey48m). –

ответ

4

Вы не можете reinterpret_cast между двумя целыми типами, периодом. Это не то, для чего стоит reinterpret_cast. Если вы хотите использовать между двумя целыми типами, используйте static_cast.

Если ваша цель состоит в том, чтобы действительно «переосмыслить битовую диаграмму», тогда вам нужно будет отбросить до ссылка. То есть, reinterpret_cast<unsigned long&>(x) действителен, если x является lзначением типа int. Но теперь вы попадаете на опасную территорию, так как это вообще неопределенное поведение и, вероятно, будет работать на 32-битной платформе x86, но будет делать что-то плохое на 64-битной платформе x86, где unsigned long длиннее int.

+0

+1 и AC для хорошего ответа, а не для голосования вниз (люди без причины) :) –

+0

Доступ к значению 'reinterpret_cast (x)' is _always_ UB; актерский состав синтаксически действителен. – ildjarn

+0

Это всегда UB, но все же возможно, что он ведет себя предсказуемо на некоторых реализациях, как и со всеми UB. – Brian

2

В соответствии со стандартом C++ (5.2.10) переинтерпретировать литой

2 Оператор reinterpret_cast не отбросит константность (5.2.11). Выражение интегрального, перечисляющего, указательного или типов-указателей может быть явно преобразовано в собственный тип; такой литой дает значение его операнда.

Используйте вместо этого static_cast.

+0

+1 но другой парень уже принят, сэр :) –

Смежные вопросы