2010-12-01 31 views
2

現在、C++のクラステンプレートに問題があります。私は現在ハッシュテーブルを作っています。C++ - クラステンプレートからメソッドを呼び出す

私はテーブルのインスタンスごとに私のハッシュ関数を指定するためのクラステンプレートとしてファンクタを使用しています。

IE:1つのテーブルには、そのキー用の整数、その​​値の文字列があります。もう一つは...その値などのためにそのキーと整数の文字列を持っている

class HashString 
{ 
    public: 
     unsigned long operator()(std::string& key, const unsigned int tableSize) 
     { 
      // ..... 
     } 

}; 

template<typename keyType, typename valueType, class HashFunctor> 
class HashTable 
{ 
    public: 
     // .... 

    private: 

     HashFunctor myHash; 

}; 

そして今の私は、キーをハッシュするために、「myHash」と呼ばれるメソッドをコールしたいとしましょう可能性があり、私は最初で、それを呼ぶだろう

myHash(key, table.size()) 

しかし、gccはHashFuntor(string、unsigned int)の関数オーバーロードを検出しません。

誰かがmyHashと呼ぶ方法を教えてもらえますか? (注:私はファンクタの私の構造を変更したくない)

編集:どこでもそれはHacheStringが実際のHashStringであると言う(:これは私が私の実際のソリューション

instantiated from ‘void tp3::Table<TypeClef, TypeDonnee, FoncHachage>::insert(const TypeClef&, const TypeDonnee&) [with TypeClef = int, TypeDonnee = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, FoncHachage = tp3::HacheString]’ 

no match for call to ‘(tp3::HacheString) (tp3::Table<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, tp3::HacheString>::HashEntry&)’ 

編集から取得するエラーメッセージですここに貼り付けるためにコードを翻訳しました)。

+0

実際のエラーとそれに対応するコードを掲載することはできますか? –

+0

@Alexエラーメッセージの1つをアップロードしました。彼らはすべて同じことを言及している(私は私の呼び出しを持っているので) – Pacane

+0

boost :: unordered_mapはあなたが望むものであるように思えるだろう(あなたはstd :: tr1 :: unordered_map、またはstd ::としてそれにアクセスすることができるかもしれないunordered_map in C++ 0x)。車輪を改造しないでください。 –

答えて

2

HashStringのoperator()はプライベートで、おそらくconst-correctではありません。 const std :: string &を最初のパラメータとするconstメンバ関数である必要があります。 2番目のパラメータはconstである必要はありません。

2番目のパラメータとしてHashEntryを使用しているようです。 HashEntryとは何ですか?それは符号なしのintを取る!

これは既にいくつかの問題を解決している可能性があります。

あなたのHacheString/HashStringの違いは単に誤字であると仮定します。

+0

実際には、それは公開されています。再入力する間違いです。はい、間違いなくハッシュ/ハッシュの入力ミスです(フレンチから英語への翻訳のタイプ) – Pacane

+0

実際、HashEntryはキー/値の「ノード」です。私は、そのキーをハッシュすることによって、テーブルにhashEntryが挿入されなければならないテーブルの位置を取得しようとしています。 – Pacane

関連する問題