Использование другого интерфейса со структурой данных stl

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)); }
};
Теги:
stl

1 ответ

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>.

Обратите внимание, что когда класс hash_map TR1 был принят в C++ 11, он был переименован в unordered_map. Таким образом, это одно и то же, и нет смысла смешивать эти два типа в одном коде. Ссылка: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html

  • 0
    Извините, это была опечатка. Я не собирался смешивать unordered_map и hash_map. Я изменил код в исходном посте.
  • 0
    Похоже, что unordered_map <void *, void *> * и unordered_map <void *, void *, HF, EQ> * совместимы, но unordered_map <void *, void *> * и unordered_map <void *, void *, hash_fun, eq_fun> * нет.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню