У меня проблема с реализацией карты с нетривиальным типом ключа.Первоначально мне требовалась карта, в которой в качестве ключа использовался бы тип GUID:
std::map<GUID, int>
Поскольку компилятор не знает, как сравнивать идентификаторы GUID, я выбрал следующий подход для решения проблемы.Давайте обернемся вокруг GUID следующим образом:
class MyGUID
{
public:
MyGUID(const GUID& _guid) : m_guid(_guid) {}
bool operator <(const MyGUID& otherGUID) const
{
return m_guid.Data1 < otherGUID.Data1;
}
bool operator ==(const MyGUID& otherGUID) const
{
return m_guid.Data1 == otherGUID.Data1;
}
private: GUID m_guid;
};
Очевидно, что приведенная выше реализация перегруженных операторов в целом недостаточна, но этого достаточно для целей моего проекта, где набор возможных GUIDпредопределено и никогда не меняется.Поэтому вместо моей исходной карты я бы использовал следующую карту:
std::map<MyGUID, int>
Компилятор (VS2015) совершенно доволен этим, и я могу заполнить карту без каких-либо проблем:
Std::map<MyGuid, int> fooMap;
GUID g1, g2;
CLSIDFromString(“{102958f3-7578-41ca-af71-aa236a488d52}”, &g1);
CLSIDFromString(“{3c55a13d-55e1-47cc-97a3-51b3f680da79}”, &g2);
fooMap[g1] = 1;
fooMap[g2] = 12;
Проблема возникает позже, когда я пытаюсь найти записи карты по ключу:
fooMap.find(g1);
В результате получается
fooMap.end()
Согласно отладчику, мои перегруженные операторы не являются событиямиисполнено как часть «найти».Что я делаю не так?