2010-11-18 7 views
3

私はunordered_mapのキーとして使用されるクラスを持っています。コードをコンパイルしようとすると、std::hash<typeName>::operator()(typename) constへの未定義の参照が表示されます。どのように私はそれを修正するために行くことができますか? unordered_mapで使用されるユーザー定義型を作成するために、追加の関数を何とか追加する必要がありますか?C++ unordered_mapユーザ定義型

私は日付と時刻の情報を格納するdateTime構造体を持っています。次のように

エラーメッセージは次のとおりです。

In function 'std::__detail::_Hash_code_base<DateTime, std::pair<DateTime const, int>, std::_Select1st<std::pair<DateTime const, int> >, std::equal_to<DateTime>, std::hash<DateTime>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_hash_code(DateTime const&) const': testing.cpp:(.text._ZNKSt8__detail15_Hash_code_baseI10DateTimeSt4pairIKS1_DeESt10_Select1stIS4_ESt8equal_toIS1_ESt4hashIS1_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashELb0EE12_M_hash_codeERS3_[std::__detail::_Hash_code_base<DateTime, std::pair<DateTime const, int>, std::_Select1st<std::pair<DateTime const, int> >, std::equal_to<DateTime>, std::hash<DateTime>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, false>::_M_hash_code(DateTime const&) const]+0x23): undefined reference to 'std::hash<DateTime>::operator()(DateTime) const'

感謝。

+1

あなたの質問には、コード、_full_の正確なエラーメッセージ、および使用しているコンパイラに関する情報が欠けています。 –

+1

私はこれがhttp://stackoverflow.com/questions/647967/how-to-extend-stdtr1hash-for-custom-typesの複製であると思います – SCFrench

+0

バックティックの中でバックティックをエスケープする方法を知っている人は、 (私はそれらを「自分の編集で」に変更しました)。 4行分のインデントを使用するには線が長すぎます。エラーメッセージでは、コンパイラはGCCのいくつかの種類です。 –

答えて

4

ハッシュアルゴリズムを実装する必要があります。それ以外の場合は、標準コンテナはタイプを選択しません。ハッシュコードの計算方法がわからないためです。

namespace std 
{  
    template <> 
    struct hash<DateTime> : public unary_function<DateTime, size_t> 
    { 
     size_t operator()(const DateTime& v) const 
     { 
      return /* my hash algorithm */; 
     } 
    }; 
} 
+0

返事をありがとう。私のdatetime構造体は、私がハッシュキーとして使うことができると考えられるティック値を持っています。私はunordered_mapを直接ハッシュキーとしてティック値を使用するように設定する方法がありますか? – Steven

+0

@Steven:パブリックデータメンバであれば、 'boost :: mem_fun(&DateTime :: ticks)'で必要なハッシュファンクタを得ることができますが、タイプとして何を設定しなければならないと思うのが恐ろしいです'std :: unordered_map'の2番目のテンプレート引数。おそらく専門化を書くのは簡単でしょう。 –

+0

@Steven:上記のAndreyのコードでは、Andreyが '/ * [あなたの]ハッシュアルゴリズム* /'を入れると言った "v.ticks"を試してみましたか? –

関連する問題