2013-09-21 1 views
0

Я пытаюсь скомпилировать проект на моем mac, который изначально написан на linux. Он прошел гладко на archlinux, но на Mac много ошибок. Тем более, я очень смущен с этим сообщением об ошибке:Ошибка компиляции Clang на 'std :: hash <unsigned long>

In file included from /Users/STW/Documents/neuroblaze/nb/tagged_index/tagged_index.t.hpp:4: 
/Users/STW/Documents/neuroblaze/nb/tagged_index/tagged_index.hpp:425:26: error: 
     implicit instantiation of undefined template 'std::hash<unsigned long>' 
    ::std::hash<IndexType> hasher; 
         ^

А вот соответствующий код: (tagged_index.hpp)

namespace std { 
/** 
* tagged_index can be hashed. Just forwards the hash to the contained type. 
* 
* @ingroup TaggedIndex 
*/ 
template <typename UniquenessTag, typename IndexType, 
      typename ConstructorFunction> 
struct hash<tsb::tagged_index<UniquenessTag, IndexType, ConstructorFunction>> { 
    using value_type = 
     tsb::tagged_index<UniquenessTag, IndexType, ConstructorFunction>; 
    ::std::hash<IndexType> hasher; 
    size_t operator()(const value_type& l) const { return hasher(l); } 
}; 

/** 
* tagged_offset can be hashed. Just forwards the hash to the contained type. 
* 
* @ingroup TaggedOffset 
*/ 
template <typename UniquenessTag, typename IndexType, 
      typename ConstructorFunction> 
struct hash<tsb::tagged_offset<UniquenessTag, IndexType, ConstructorFunction>> { 
    using value_type = 
     tsb::tagged_offset<UniquenessTag, IndexType, ConstructorFunction>; 
    ::std::hash<IndexType> hasher; 
    size_t operator()(const value_type& l) const { return hasher(l); } 
}; 

} // end namespace std 

Я включил функционал в этом HPP файл.

+0

Вам не разрешено добавлять материал в 'namespace std'. –

+0

На самом деле это не мой код. И он отлично работает на archlinux. Weird. –

+2

@ н.м. Кроме специализаций шаблонов, таких как [эти] (http://stackoverflow.com/a/8157967/865874). – rodrigo

ответ

1

Вы также включаете в себя "память"? Я просто нашел, что может быть ошибкой в ​​стандартном библиотечном коде Кланга.

Она имеет следующее определение хэша:

template <class _Tp> struct hash; 

Это не то же самое, как один в __functional_base:

template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash; 

Это может привести к нарушению ODR, в зависимости от того, как определяется _LIBCPP_TYPE_VIS_ONLY. Все специализации для hash <> целочисленных типов используют этот символ, поэтому, возможно, переопределение делает их недействительными.

Я обнаружил, что включение функционала после запоминания улучшает результаты, чем включение памяти после работы.