0

私は HashMap と呼ばれる次のクラスを持っています。これは、1 つのコンストラクターがユーザーが提供したものを受け入れることができ、HashFunction次に私が実装するものです。

私が直面している問題はHashFunction、何も提供されていないときに自分自身を定義することです。以下は、私が作業していて、gcc からエラーが発生するサンプル コードです。

HashMap.cpp:20:20: error: reference to non-static member function must be called
    hashCompress = hashCompressFunction;
                   ^~~~~~~~~~~~~~~~~~~~`

ヘッダー ファイル:

class HashMap
{
    public:
        typedef std::function<unsigned int(const std::string&)> HashFunction;
        HashMap();
        HashMap(HashFunction hashFunction);
        ...
    private:
        unsigned int hashCompressFunction(const std::string& s);
        HashFunction hashCompress;
}

ソースファイル:

unsigned int HashMap::hashCompressFunction(const std::string& s) 
{
    ... my ultra cool hash ...

    return some_unsigned_int;
}

HashMap::HashMap()
{
    ...
    hashCompress = hashCompressFunction;
    ...
}

HashMap::HashMap(HashFunction hf)
{
    ...
    hashCompress = hf;
    ...
}
4

1 に答える 1

1

hashCompressFunctionはメンバー関数であり、通常の関数とは大きく異なります。メンバー関数には暗黙的thisなポインターがあり、常にオブジェクトに対して呼び出す必要があります。に割り当てるには、現在のインスタンスをバインドするためにstd::function使用できます。std::bind

hashCompress = std::bind(&HashMap::hashCompressFunction, 
                         this, std::placeholders::_1);

ただし、標準ライブラリがstd::hashを使用してそれを行う方法を確認する必要があります。

于 2013-11-15T03:25:03.173 に答える