明确的专业化; '的std ::散列< _Kty>'已经被实例化了

时间:2017-10-07 10:28:44

标签: c++ templates

首先,代码

“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

1 个答案:

答案 0 :(得分:4)

在无序映射之前放置哈希的特化。

当您第一次使用无序映射(您的类型)时,哈希已经实例化。之后将它专门化是一个错误 - 这既是为了避免常见错误,又是为了让编译器的生活更轻松。您可以安全地“破坏”命名空间定义以专门化,然后继续添加到doge命名空间。