Ошибка компиляции Clang для ‘std :: hash & lt; unsigned long & gt;’

Я пытаюсь скомпилировать проект на моем Mac, который изначально написан на Linux. На archlinux все прошло гладко, но на Mac было много ошибок. Особенно меня очень смущает это сообщение об ошибке:

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

Решение

Вы тоже включили «память»? Я только что нашел ошибку в коде стандартной библиотеки Clang.

У него есть следующее определение хеша:

template <class _Tp> struct hash;

Это не то же самое, что в __functional_base:

template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash;

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]