4

コードで 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;

...
...
};

私が含めた最後の行は、ハッシュが使用されている唯一の場所です。何が起こっているのでしょうか?

どうもありがとう、オヌール

4

2 に答える 2

6

www.sgi.comから:「ハッシュ テンプレートは、型 char*、const char*、crope、wrope、および組み込みの整数型のテンプレート引数に対してのみ定義されます。異なる引数型のハッシュ関数が必要な場合は、独自のテンプレートの特殊化を提供するか、別のハッシュ関数を使用する必要があります。」

関数を定義する必要があると確信してstd:size_t hash_value(DottedRule const&)おり、そうすればhash<DottedRule>. 詳細については、ブーストのドキュメントを参照してください。

于 2009-12-11T22:40:57.947 に答える
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());
    }
};
}
于 2013-07-16T11:27:54.010 に答える