Clang编译错误'std :: hash <unsigned long =“”>''</unsigned>

时间:2013-09-21 22:23:59

标签: c++ macos c++11 stdhash

我正在尝试在我的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文件中包含了功能。

1 个答案:

答案 0 :(得分:1)

你还包括“记忆”吗?我刚刚发现了Clang标准库代码中可能存在的错误。

它具有以下hash的定义:

template <class _Tp> struct hash; 

这与__functional_base中的不一样:

template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash;

这可能违反ODR,具体取决于_LIBCPP_TYPE_VIS_ONLY的定义方式。 hash的所有特化&lt;&gt;整数类型使用该符号,因此重新定义可能使它们无效。

我发现包含内存后功能的效果比功能后包含内存要好。