【问题标题】:How to implement std::hash for a template class如何为模板类实现 std::hash
【发布时间】:2017-04-26 19:04:43
【问题描述】:

我有一个看起来像这样的模板类:

template <int N, class TypeId> class Indexer {
...
}

我想在std::unordered_map 中使用它,我需要一个哈希函数。 在代码库中,我们已经有类似的东西(但在一个未模板化的类上),所以我尝试这样做:

namespace std {
template <int N, class TypeId>
struct hash<Indexer<N, TypeId> > {
    size_t operator()(const Indexer<N, TypeId>& id) const noexcept {
        ...
    }
};
}

它也与another answer 非常相似。 不幸的是,这不起作用,只会给出一堆无益的错误。有什么见解吗?

【问题讨论】:

  • “这不起作用”不是一个有用的问题描述。
  • 如果这些错误对你有帮助,你就不需要问了。但它们对没有帮助的事实并不意味着它们对我们没有帮助,你希望他们解决问题。发布完整的错误消息以及minimal reproducible example(重现它们的代码)。
  • 不以“in file included from”或“instantiation of”或“required from here”开头的第一行错误消息是什么?
  • 我认为std::hash 的部分特化没有任何问题,您需要显示实际错误(以及相关代码)
  • 请注意,“模板类”具有误导性。您还没有课程。 Indexer 是一个“类模板”,一种用于创建类的模板。模板实例化Indexer&lt;5, int&gt; 将是一个类。

标签: c++ c++11 templates


【解决方案1】:

看起来您在 Indexer 类的定义末尾缺少一个分号。

这行得通:

#include <functional>

template <int N, class TypeId> struct Indexer {};

namespace std {
template <int N, class TypeId>
struct hash<Indexer<N, TypeId> > {
   size_t operator()(const Indexer<N, TypeId>& id) const noexcept { return 0; }
};
}

int main() {
   return 0;
}

【讨论】:

  • 分号在那里。该类已在其他地方使用!
猜你喜欢
  • 2013-05-03
  • 2012-05-15
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
相关资源
最近更新 更多