Использование карты с нетривиальным типом ключа - PullRequest
0 голосов
/ 24 июня 2018

У меня проблема с реализацией карты с нетривиальным типом ключа.Первоначально мне требовалась карта, в которой в качестве ключа использовался бы тип 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()

Согласно отладчику, мои перегруженные операторы не являются событиямиисполнено как часть «найти».Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...