2010-11-18 11 views
3

J'ai une classe qui est utilisée comme clé dans unordered_map. Lorsque j'ai essayé de compiler le code, il affiche une référence indéfinie à std::hash<typeName>::operator()(typename) const. Comment pourrais-je aller le réparer? Quelle fonction supplémentaire ai-je besoin de surcharger pour que le type défini par l'utilisateur soit utilisé dans unordord_map?C++ unordered_map type défini par l'utilisateur

J'ai une structure dateTime qui stocke les informations de date et d'heure.

Le message d'erreur est le suivant:

In function 'std::__detail::_Hash_code_base<DateTime, std::pair<DateTime const, int>, std::_Select1st<std::pair<DateTime const, int> >, std::equal_to<DateTime>, std::hash<DateTime>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_hash_code(DateTime const&) const': testing.cpp:(.text._ZNKSt8__detail15_Hash_code_baseI10DateTimeSt4pairIKS1_DeESt10_Select1stIS4_ESt8equal_toIS1_ESt4hashIS1_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashELb0EE12_M_hash_codeERS3_[std::__detail::_Hash_code_base<DateTime, std::pair<DateTime const, int>, std::_Select1st<std::pair<DateTime const, int> >, std::equal_to<DateTime>, std::hash<DateTime>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_hash_code(DateTime const&) const]+0x23): undefined reference to 'std::hash<DateTime>::operator()(DateTime) const'

Merci.

+1

Votre question manque cruellement de code, le message d'erreur exact et _full_, ainsi que des informations sur le compilateur que vous utilisez. –

+1

Je pense qu'il s'agit d'un duplicata de http://stackoverflow.com/questions/647967/how-to-extend-stdtr1hash-for-custom-types – SCFrench

+0

Si quelqu'un sait comment échapper à un backtick à l'intérieur des backticks, n'hésitez pas à le faire (Je les ai changés pour 'dans mon édition). Les lignes sont trop longues pour que "indentation par 4 espaces" soit utile. Par le message d'erreur, le compilateur est une variété de GCC. –

Répondre

4

vous devez implémenter l'algorithme de hachage, sinon le conteneur standard ne choisira pas votre type, car il n'a aucune idée de la façon de calculer le code de hachage pour cela.

namespace std 
{  
    template <> 
    struct hash<DateTime> : public unary_function<DateTime, size_t> 
    { 
     size_t operator()(const DateTime& v) const 
     { 
      return /* my hash algorithm */; 
     } 
    }; 
} 
+0

Merci pour la réponse. Ma structure datetime a la valeur ticks que je pense pourrait être utilisé comme clé de hachage. Existe-t-il une méthode qui pourrait me permettre de définir unordered_map pour utiliser directement la valeur ticks comme clé de hachage? – Steven

+0

@Steven: Si c'est un membre de données publiques, vous pouvez obtenir le foncteur de hachage dont vous avez besoin avec 'boost :: mem_fun (& DateTime :: ticks)', mais je crains de penser au type que vous devez définir comme deuxième argument de modèle pour 'std :: unordered_map'. Probablement plus facile juste pour écrire la spécialisation. –

+0

@Steven: dans le code d'Andrey ci-dessus, avez-vous essayé "v.ticks" où Andrey a dit de mettre "/ * [votre] algorithme de hachage * /' ...? –