GUID为std :: map键

fer*_*ras 2 c++ boost guid stdmap

字典定义如下:

typedef boost::tuple<conn_ptr, handler_ptr, rdp_ptr> conn_tuple;
typedef std::map<GUID, conn_tuple> conn_map; 
Run Code Online (Sandbox Code Playgroud)

我们遇到了编译错误:

错误9错误C2678:二进制'<':找不到运算符,它接受类型为'const GUID'的左手操作数(或者没有可接受的转换)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; 
Run Code Online (Sandbox Code Playgroud)

现在,所有编译,但然后我们在运行时得到一个异常(无效的运算符<).

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

Che*_*Alf 6

显示的比较运算符可以返回false两者a<b,b<a何时a不比较等于b.

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


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


Ric*_*ges 5

您的 GUIDComparer 正在比较相等性。您传递给映射的函子必须生成弱排序 - 即它必须比较小或比较大,而不是相等。

这将起作用:

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

  • 缺少 `static_assert(std::is_pod&lt;GUID&gt;::value, "not apply");` 并且在答案中甚至没有提到 POD 让我 -1 这个 (2认同)