c++ 如何为模板类实现std::hash

68de4m5k  于 2023-04-01  发布在  其他
关注(0)|答案(2)|浏览(132)

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

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。不幸的是,这不起作用,只是给出了一堆无用的错误。有什么见解吗?

oaxa6hgo

oaxa6hgo1#

在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;
}
gcxthw6b

gcxthw6b2#

使用Visual Studio 2022和C++ 14,我也得到了错误,上面的解决方案都不起作用。省略“hash”后面的模板参数对我来说是个窍门。

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

相关问题