0

これら2つのコンストラクターでクラスを作成したいのですがunordered_map<void*,void*> *、コンストラクターで作成されたこれら2つは互換性がありません。コンストラクターのプロトタイプを保持しながら、次のコードが機能するように変更するにはどうすればよいですか。

struct eq_fun
{
    bool operator()(void* s1, const void* s2) const
    {
        return ( _cmp_fn((void*)s1,(void*)s2) == 0 );
    }
    int (*_cmp_fn)(void*, void*);
    eq_fun(int (*fn)(void*, void*)):_cmp_fn(fn){}
};

struct hash_fun
{
    size_t operator()(const void *p) const
    {
        return _hash_fn(p);
    }
    int (*_hash_fn)(const void*);
    hash_fun(int (*fn)(const void*)):_hash_fn(fn){}
};

class MyClass {
    private:
        unordered_map<void*,void*> *h_map;
    public:
        template<class EQ,class HF>MyClass()
        { h_map = new unordered_map<void*,void*,HF,EQ>(); }

        MyClass(int (*h)(const void*),int (*cmp)(void*,void*))
        { h_map = new unordered_map<void*,void*,hash_fun,eq_fun>(0,hash_fun(h),eq_fun(cmp)); }
};
4

1 に答える 1

1

コンストラクターのテンプレート引数に応じて、別のテンプレート メンバーを作成しようとしているようです。これは、C++ では 2 つの点で不可能です。

  • これ:

    unordered_map<void*,void*> *h_map;
    h_map = new hash_map<void*,void*,HF,EQ>();
    

    hash_mapはの派生クラスではないため無効ですunordered_map

  • EQパラメータとパラメータを使用しようとしているように、変換できないテンプレート パラメータを混在させることはできませんHFhash_map<..,..,HF1>互換性hash_map<..,..,HF2>のないタイプです。

私が見ることができる唯一の方法は、hash_mapまたはテンプレートunordered_mapを作成することです。MyClassMyClass<HF, EQ>

TR1 クラスhash_mapが C++11 に受け入れられたときに、名前が変更されたことに注意してくださいunordered_map。したがって、これらは同じものであり、これら 2 つのタイプを同じコードに混在させることは意味がありません。参照: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html

于 2013-10-08T03:14:24.293 に答える