我在我的代码中使用了TR1实现的unordered_map,链接器出现了奇怪的错误,我甚至无法破译:
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 :: hash :: operator()(DottedRule)const'
的未定义引用我猜这是关于哈希的用法。现在,整个代码太大了(如果你想看到它我可能会在以后发布),但相关的部分是:
# 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 :(得分:6)
From www.sgi.com:“散列模板仅为char *,const char *,crope,wrope和内置整数类型的模板参数定义。如果需要具有不同的Hash函数参数类型,您必须提供自己的模板特化,否则使用不同的哈希函数。“
我很确定您需要定义std:size_t hash_value(DottedRule const&)
函数,然后您才能使用hash<DottedRule>
。有关详细信息,请参阅boost docs。
答案 1 :(得分: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());
}
};
}