Как использовать struct в качестве ключа в std :: map - PullRequest
6 голосов
/ 18 марта 2011

Я хочу использовать std::map, чьи элементы ключа и значения являются структурами.

Я получаю следующую ошибку: error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'const GUID

Я понимаю, что для этого случая я должен перегрузить operator <, но дело в том, что у меня нет доступа к коду структуры, которую я хочу использовать (структура GUID в VC ++).

Вот фрагмент кода:

//.h

#include <map>
using namespace std;

map<GUID,GUID> mapGUID;


//.cpp

GUID tempObj1, tempObj2;              
mapGUID.insert( pair<GUID,GUID>(tempObj1, tempObj2) );   

Как решить эту проблему?

Ответы [ 4 ]

10 голосов
/ 18 марта 2011

Вы можете определить оператор сравнения как отдельную функцию:

bool operator<(const GUID & Left, const GUID & Right)
{
    // comparison logic goes here
}

Или, поскольку в общем случае оператор <не имеет особого смысла для идентификаторов GUID, вместо него можно указать пользовательский функтор сравнения в качестве третьего аргумента шаблона <code>std::map:

struct GUIDComparer
{
    bool operator()(const GUID & Left, const GUID & Right) const
    {
        // comparison logic goes here
    }
};

// ...

std::map<GUID, GUID, GUIDComparer> mapGUID;
2 голосов
/ 18 марта 2011

Любой тип, который вы используете в качестве ключа, должен обеспечивать строгое слабое упорядочение.Вы можете указать тип компаратора в качестве третьего аргумента шаблона или перегрузить operator< для вашего типа.

0 голосов
/ 18 марта 2011

Может быть, вы используете класс, унаследованный от GUID, в котором вы реализуете оператор <- это обходной путь для вас? </p>

0 голосов
/ 18 марта 2011

Для GUIDS нет оператора <, поэтому вы должны либо указать оператор сравнения, либо использовать другой ключ.</p>

...