如何在std :: map中使用struct作为键

时间:2011-03-18 14:19:29

标签: c++ stl visual-studio-2005 stdmap

我想使用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 <,但问题是我无法访问我想要使用的结构的代码(VC ++中的GUID结构)。

以下是代码段:

//.h

#include <map>
using namespace std;

map<GUID,GUID> mapGUID;


//.cpp

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

如何解决这个问题?

4 个答案:

答案 0 :(得分:10)

您可以将比较运算符定义为独立函数:

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

或者,因为通常a&lt;运算符对GUID没有多大意义,您可以提供自定义比较函子作为std::map模板的第三个参数:

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

// ...

std::map<GUID, GUID, GUIDComparer> mapGUID;

答案 1 :(得分:2)

您用作密钥的任何类型都必须提供严格的弱排序。您可以提供比较器类型作为第三个模板参数,或者可以为您的类型重载operator<

答案 2 :(得分:0)

没有运营商&lt;对于GUIDS,您要么必须提供比较运算符,要么使用不同的键。

答案 3 :(得分:0)

可能正在使用从GUID继承的类,您在其中实现了运算符&lt;对你来说会是一种解决方法吗?