2009-12-11 33 views
3

J'utilise la unordered_map de mise en œuvre TR1 dans mon code et l'éditeur de liens donne des erreurs étranges que je ne peux pas déchiffrer même:g ++ linker erreur: Obtention de l'erreur de référence non définie pour std :: hachage

BPCFG.o: In function `std::__detail::_Hash_code_base<DottedRule, std::pair<DottedRule const, int>, std::_Select1st<std::pair<DottedRule const, int> >, eqDottedRule, std::hash<DottedRule>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_hash_code(DottedRule const&) const': 
BPCFG.cpp: (.text._ZNKSt8__detail15_Hash_code_baseI10DottedRuleSt4pairIKS1_iESt10_Select1stIS4_E12eqDottedRuleSt4hashIS1_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashELb0EE12_M_hash_codeERS3_[std::__detail::_Hash_code_base<DottedRule, std::pair<DottedRule const, int>, std::_Select1st<std::pair<DottedRule const, int> >, eqDottedRule, std::hash<DottedRule>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_hash_code(DottedRule const&) const]+0x23): undefined reference to `std::hash<DottedRule>::operator()(DottedRule) const' 
BPCFG.o: In function `std::__detail::_Hash_code_base<DottedRule, std::pair<DottedRule const, int>, std::_Select1st<std::pair<DottedRule const, int> >, eqDottedRule, std::hash<DottedRule>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node<std::pair<DottedRule const, int>, false> const*, unsigned long) const': 
BPCFG.cpp: (.text._ZNKSt8__detail15_Hash_code_baseI10DottedRuleSt4pairIKS1_iESt10_Select1stIS4_E12eqDottedRuleSt4hashIS1_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashELb0EE15_M_bucket_indexEPKNS_10_Hash_nodeIS4_Lb0EEEm[std::__detail::_Hash_code_base<DottedRule, std::pair<DottedRule const, int>, std::_Select1st<std::pair<DottedRule const, int> >, eqDottedRule, std::hash<DottedRule>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_bucket_index(std::__detail::_Hash_node<std::pair<DottedRule const, int>, false> const*, unsigned long) const]+0x33): undefined reference to `std::hash<DottedRule>::operator()(DottedRule) const' 
collect2: ld returned 1 exit status 

C'est l'erreur et je ne peux même pas détecter la ligne à partir de laquelle il est orienté? De la déclaration:

undefined reference to `std :: hachage :: operator() (DottedRule) const »

Je pense qu'il est sur l'utilisation de hachage. Maintenant, tout le code est trop grand (si vous voulez quand même le voir je l'afficher plus tard), mais les parties pertinentes sont:

# include <unordered_map>  // Used as hash table 
# include <stdlib.h> 
# include <string.h> 
# include <vector> 

# define NO_SYMBOL -1 

using namespace std; 
using std::unordered_map; 
using std::hash; 

... 
... 
... 

class DottedRule { 
    public: 
     int symbol; 
     int expansion; 
     int dot_position; 
}; 

struct eqDottedRule 
{ 
    bool operator()(const DottedRule & r1, const DottedRule & r2) const 
    { 
    return r1.symbol == r2.symbol && r1.expansion == r2.expansion && r1.dot_position == r2.dot_position; 
    } 
}; 


... 
... 
... 
class BPCFG { 

    public: 


... 
... 
... 
... 

unordered_map<DottedRule, int, hash<DottedRule>, eqDottedRule> symbol_after_dot; 

... 
... 
}; 

La dernière ligne I inclus est le seul endroit où hachage est utilisé. Une idée de ce qui pourrait se passer?

Merci beaucoup, Onur

+0

En standard, le hachage C++ n'est pas déclaré dans l'espace de noms std. Mais à moins de poster plus de code, il est difficile de dire si c'est un problème ou non. En outre, en fonction de ce que vous faites devrait être

Répondre

5

De www.sgi.com: « Le modèle de hachage est uniquement défini pour les arguments de modèle de type char *, const char *, crope, wrope et les types intégraux intégré Si vous. vous avez besoin d'une fonction de hachage avec un type d'argument différent, vous devez soit fournir votre propre spécialisation de modèle, soit utiliser une fonction de hachage différente. " Je suis assez sûr que vous devez définir une fonction std:size_t hash_value(DottedRule const&), puis vous pourrez utiliser hash<DottedRule>. Voir le boost docs pour plus d'informations.

+0

Merci! Spécialisation std :: hash a parfaitement fonctionné. –

0

Simple hachage pour ma classe. Cals hash from string

namespace std 
{ 
template<> 
struct hash<Letter> : public __hash_base<size_t, Letter> 
{ 
    size_t operator()(const Letter& v) const 
    { 
     hash<string> hasher; 
     return hasher.operator()(v.getSign()); 
    } 
}; 
}