【问题标题】:explicit specialization; 'std::hash<_Kty>' has already been instantiated明确的专业化; 'std::hash<_Kty>' 已经被实例化了
【发布时间】:2017-10-07 10:28:43
【问题描述】:

首先是代码

“文件.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);
        }
    };
}

我收到标题中的错误,这似乎表明已生成多个哈希代码。我在错误消息中收到其中 2 个,每个 unordered_map 一个,有人可以帮我找出问题所在。谢谢。

explicit specialization; 'std::hash<_Kty>' has already been instantiated

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    将散列的特化放在无序映射之前。

    当您第一次使用(您的类型的)无序映射时,哈希已经被实例化了。事后对其进行专门化是错误的——这既是为了避免常见错误,也是为了让编译器的工作更轻松。您可以安全地“破坏”命名空间定义以进行专门化,然后继续添加到 doge 命名空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 2013-12-05
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      相关资源
      最近更新 更多