我有一个模板结构。 struct foo具有嵌套类型。
template<typename Data>
struct Bar{
};
template<typename Data>
struct Foo {
typedef typename std::pair<Bar<Data>*,Foo<Data>*> Pointers;
std::unordered_set<Pointers> pointers;
};
我希望make指针适用于std::unordered_set<Pointers>
我在这里读到:
How to specialize std::hash::operator() for user-defined type in unordered containers?
How to properly hash the custom struct?
boost::hash_combine
Templates and nested classes/structures
将所有知识结合到此代码中:
namespace std {
template <typename Dara> struct hash< typename Foo<Data>::Pointers>
{
size_t operator()(const typename Foo<Data>::Pointers & x) const
{
std::size_t seed = 0;
boost::hash_combine(seed, x.first);
boost::hash_combine(seed, x.second);
return seed;
}
};
}
在最后一段代码中,编译器抛出一个错误:
错误:部分特化中未使用的模板参数:
Data
指向此处:typename Data。
我尝试从模板中删除数据并像这样使用它:
template <> struct hash< typename Foo::Pointers>
但是编译器告诉我模板的类型错误。
我如何更正我的代码?
此致 塔尔。
答案 0 :(得分:1)
您无法专注于嵌套类型。编译器无法推断出您想要专门化的内容。您可以直接将std::hash<...>
专门用于合适的类型:
namespace std {
template <typename Data>
struct hash<std::pair<Bar<Data>*,Foo<Data>*>> {
...
}
}
请注意,指针通常不会成为好键。您可能希望将*x.first
和*x.second
与hash_combine()
一起使用。
答案 1 :(得分:0)
我找到了更简单的解决方案: 添加boost :: hash:
让Foo结构像那样:
template<typename Data>
struct Foo {
typedef typename std::pair<Bar<Data>*,Foo<Data>*> Pointers;
std::unordered_set<Pointers,boost::hash<Pointers> pointers;
};
从here阅读: