GUID为std :: map键

时间:2015-04-03 17:21:34

标签: c++ boost guid stdmap

字典定义如下:

typedef boost::tuple<conn_ptr, handler_ptr, rdp_ptr> conn_tuple;
typedef std::map<GUID, conn_tuple> conn_map; 

我们遇到了编译错误:

  

错误9错误C2678:二进制&#39;&lt;&#39; :找不到哪个运营商需要   左手操作数类型&#39; const GUID&#39; (或者没有可接受的   转换)c:\ program files(x86)\ microsoft visual studio   11.0 \ VC \包括\ xstddef

然后我们解决它:

struct GUIDComparer
{
    bool operator()(const GUID & Left, const GUID & Right) const
    {
        // comparison logic goes here
        if( (Left.Data1 == Right.Data1) && (Left.Data2 == Right.Data2) && 
            (Left.Data3 == Right.Data3) && (memcmp(Left.Data4 , Right.Data4,sizeof(Right.Data4))==0)  )
        {   
            return true;
        }
        return false;
    }
};
typedef boost::tuple<conn_ptr, handler_ptr, rdp_ptr> conn_tuple;
typedef std::map<GUID, conn_tuple, GUIDComparer> conn_map; 

现在,所有已编译,但随后我们在运行时获得异常(无效的运算符&lt;)。

我不知道出了什么问题,如果有人可以提供帮助,我会很高兴

4 个答案:

答案 0 :(得分:6)

false未与a<b相等时,显示的比较运算符可以为b<aa返回b

只需将memcmp应用于整个事情并检查结果。


附录(由于sehe的评论)。此问题标记为的GUID类型是标准128位UUID的Windows API名称,通用唯一标识符。它保证了POD,而且保证连续,因为它保证了128位,每一个都有意义。这样可以安全地使用memcmp

答案 1 :(得分:4)

您的GUIDComparer正在比较是否相等。传递给地图的仿函数必须生成弱排序 - 即它必须比较少或比较大,不等。

这将有效:

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

答案 2 :(得分:2)

您可以考虑使用Boost.UUID而不是Windows SDK提供的GUID。

#include <boost/uuid/uuid.hpp>

typedef std::map<boost::uuids::uuid, conn_tuple> conn_map;

boost::uuids::uuid已经提供了必要的比较运算符,因此您不必按照其他答案中的建议编写排序谓词。

答案 3 :(得分:-1)

struct GUIDComparer
{
    bool operator()(const GUID & Left, const GUID & Right) const
    {enter code here
        // comparison logic goes here
        return memcmp(&Left , &Right,sizeof(Right)) < 0;
    }
};

sometimes this does not work.

it should be: return memcmp(&Left , &Right,sizeof(Right)) == -1; (not 0)