【问题标题】:g++ linker error: Getting undefined reference error for std::hashg++ 链接器错误:获取 std::hash 的未定义引用错误
【发布时间】:2010-12-25 20:42:22
【问题描述】:

我在我的代码中使用了 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;

...
...
};

我包含的最后一行是唯一使用哈希的地方。知道会发生什么吗?

非常感谢, 奥努尔

【问题讨论】:

  • 在标准 C++ 中,未在 std 命名空间中声明散列。但是除非您发布更多代码,否则很难说这是否是一个问题。另外,根据你在做什么 应该是

标签: c++ hash linker-errors unordered-map stdhash


【解决方案1】:

来自www.sgi.com:“哈希模板仅针对 char*、const char*、crope、wrope 和内置整数类型的模板参数定义。如果您需要具有不同参数类型的哈希函数,您必须提供自己的模板特化,或者使用不同的哈希函数。”

我很确定你需要定义一个std:size_t hash_value(DottedRule const&amp;) 函数,然后你就可以使用hash&lt;DottedRule&gt;。请参阅boost docs 了解更多信息。

【讨论】:

    【解决方案2】:

    我的班级的简单哈希。它从字符串中调用哈希

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2013-04-04
      相关资源
      最近更新 更多