0

我想用这两个构造函数创建一个类,但是unordered_map<void*,void*> *在构造函数中创建的这两个不兼容。在保留构造函数原型的同时,如何更改以使以下代码正常工作。

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++ 中以两种方式是不可能的。

  • 这个:

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

    无效,因为hash_map不是 的派生类unordered_map

  • 您不能像尝试使用EQand参数那样混合不可发现的模板HF参数。hash_map<..,..,HF1>并且hash_map<..,..,HF2>不是兼容的类型。

我能看到的唯一出路是选择hash_maporunordered_map并制作MyClass一个 template MyClass<HF, EQ>

请注意,当 TR1 类hash_map被 C++11 接受时,它被重命名为unordered_map. 所以它们是同一个东西,在同一个代码中混合这两种类型是没有意义的。参考:http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html

于 2013-10-08T03:14:24.293 回答