Как создать карту map

Хочу создать контейнер объектов COM с указателями на интерфейс.

using ppvmap = std::map<CLSID, LPVOID*>;
ppvmap InterfaceList;

При попытке компиляции получаю ошибки на InterfaceList[rclsid] или InterfaceList.find(rclsid):

С2676 бинарный "<": "const _Ty" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору

Ссылка ошибки ведет к этому участку кода на вторую строку в файле библиотеки type_traits:

_NODISCARD constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
    noexcept(noexcept(_STD _Fake_copy_init<bool>(_Left < _Right))) /* strengthened */ {
    return _Left < _Right;
}

Если использовать flat_hash_map:

using gtl::flat_hash_map;
using ppvmap = flat_hash_map<CLSID, LPVOID*>;
ppvmap InterfaceList;

то при тех же обстоятельствах получаю ошибку:

C2064 результатом вычисления фрагмента не является функция, принимающая 1 аргументов

ссылка ошибки ведет к этому участку кода на последнюю строку в файле библиотеки phmap_utils.hpp:

template<class U, typename std::enable_if<!has_hash_value<U>::value, int>::type = 0>
size_t _hash(const T& val) const {
    return std::hash<T>()(val);
}

Есть смежная тема на английском языке, которая для меня была мало информативна. Пожалуйста, кто знает, подскажите, как реализовать такую карту.


Ответы (1 шт):

Автор решения: Стас Палыч

Реализовал следующим способом:

struct cmpCLSID
{
    bool operator()(const CLSID& s1, const CLSID& s2) const
    {
        return memcmp(&s1, &s2, sizeof(CLSID)) < 0;
    }
};
using ppvmap = std::map<CLSID, LPVOID*, cmpCLSID>;
ppvmap InterfaceList;

Добавил оператор сравнения из функции IsEqualGUID - memcmp(&s1, &s2, sizeof(CLSID)). Теперь карта работает как обычно:

// запись в карту
InterfaceList[rclsid] = ppv; 

// поиск ключа и возвращение его значения
auto it = InterfaceList.find(rclsid);
if (it != InterfaceList.end())
{
    return it->second;
}
→ Ссылка