我想用这两个构造函数创建一个类,但是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)); }
};
答案 0 :(得分:1)
您似乎正在尝试根据构造函数的模板参数创建不同的模板化成员。在C ++中,这在两个方面是不可能的。
此:
unordered_map<void*,void*> *h_map;
h_map = new hash_map<void*,void*,HF,EQ>();
无效,因为hash_map
不是unordered_map
的派生类。
您无法混合不可复制的模板参数,例如您尝试使用EQ
和HF
参数。 hash_map<..,..,HF1>
和hash_map<..,..,HF2>
不兼容。
我能看到的唯一出路是选择hash_map
或unordered_map
并将MyClass
设为模板MyClass<HF, EQ>
。
请注意,当TR1类hash_map
被C ++ 11接受时,它被重命名为unordered_map
。所以它们是同一个东西,在同一个代码中混合这两种类型是没有意义的。参考:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html