2009-12-11 105 views
3

我使用TR1实现的unordered_map在我的代码和链接器提供了奇怪的错误,我甚至不能破译:克++链接错误:获取未定义的引用错误的std ::哈希

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 

这是错误我甚至无法检测到它的方向?从声明:

未定义的引用'的std ::哈希::运算符()(DottedRule)常量”

我猜想,这是关于哈希的使用。现在,整个代码太大了(如果你仍然想看到它,我可以在以后发布),但相关的部分是:

# 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; 

... 
... 
}; 

我包括最后一行是仅在使用哈希的地方。任何想法可能会发生什么?

非常感谢, 厄尼尔

+0

标准C++哈希没有在std命名空间中声明。但是除非你发布更多的代码,否则很难说这是否是一个问题。另外,根据你在做什么应该是 2009-12-11 22:41:11

回答

5

www.sgi.com:“哈希模板只为char *类型,为const char *,crope,wrope的模板参数定义,内置的整型如果你。需要一个具有不同参数类型的哈希函数,您必须提供自己的模板特化或使用不同的哈希函数。“

我很肯定你需要定义一个std:size_t hash_value(DottedRule const&)函数,然后你就可以使用hash<DottedRule>。有关更多信息,请参阅boost docs

+0

谢谢!专精std :: hash完美工作。 – 2009-12-12 19:25:58

0

我的班级的简单散列。它从字符串加密哈希

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()); 
    } 
}; 
}