Я хочу создать класс с этими двумя конструкторами, но 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)); }
};
Кажется, вы пытаетесь создать другой шаблонный элемент в зависимости от аргументов шаблона конструктора. Это невозможно в 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>
.
Обратите внимание, что когда класс hash_map
TR1 был принят в C++ 11, он был переименован в unordered_map
. Таким образом, это одно и то же, и нет смысла смешивать эти два типа в одном коде. Ссылка: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html