2

現在、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 を呼び出す方法を教えてもらえますか? (注: ファンクターの構造を変更したくありません)

編集:これは、実際のソリューションから得られるエラーメッセージです

  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&)’

編集: HacheString が実際には HashString であると書かれている箇所はどこでも (コードを翻訳してここに貼り付けました)。

4

1 に答える 1

2

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

HashEntry を 2 番目のパラメーターとして呼び出しているようです。ハッシュエントリーとは?unsigned int が必要です。

それはすでにあなたの問題のいくつかを解決するかもしれません.

あなたの HacheString / HashString の違いは単なるタイプミスだと思います。

于 2010-12-01T00:24:30.277 に答える