Как создать карту 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;
}