2017-10-07 1 views
0

première place, le codespécialisation explicite; « Std :: hachage <_Kty> » a déjà été instancié

« fichier.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); 
     } 
    }; 
} 

Je reçois l'erreur dans le titre qui semble indiquer le code multiple pour le hash a été généré. Je reçois 2 d'entre eux dans mon message d'erreur, un pour chaque unordered_map, quelqu'un peut m'aider à identifier le problème. Merci.

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

Répondre

1

Mettez la spécialisation du hachage avant la carte non ordonnée.

Lorsque vous utilisez pour la première fois la carte non ordonnée (de votre type), le hachage est déjà instancié. C'est une erreur de le spécialiser ensuite - c'est à la fois pour éviter les erreurs courantes et pour faciliter la vie du compilateur. Vous pouvez «casser» la définition d'espace de noms en toute sécurité pour vous spécialiser, puis continuer à ajouter à l'espace de noms doge.