首先,代码
“file.h”
namespace doge
{
struct A
{
void func() = 0;
};
struct Aa : public A
{
std::string id;
void func() override {}
};
template<T>
struct Aaa: public Aa
{
T data;
void func() override {}
};
class D
{
private:
std::unordered_map<Aa,int> intMap;
std::unordered_map<Aa,std::string> stringMap;
};
}
namespace std
{
template<> struct hash<doge::Aa>
{
std::size_t operator()(const doge::Aa & key)
{
return hash<string>()(key.id);
}
};
}
我收到了标题中的错误,似乎表明已经生成了多个哈希代码。我在错误消息中得到了其中的两个,每个unordered_map一个,有人可以帮我识别问题。感谢。
explicit specialization; 'std::hash<_Kty>' has already been instantiated
答案 0 :(得分:4)
在无序映射之前放置哈希的特化。
当您第一次使用无序映射(您的类型)时,哈希已经实例化。之后将它专门化是一个错误 - 这既是为了避免常见错误,又是为了让编译器的生活更轻松。您可以安全地“破坏”命名空间定义以专门化,然后继续添加到doge命名空间。