GUID 作为 std::map 键
GUID as std::map key
字典定义如下:
typedef boost::tuple<conn_ptr, handler_ptr, rdp_ptr> conn_tuple;
typedef std::map<GUID, conn_tuple> conn_map;
我们遇到编译错误:
Error 9 error C2678: binary '<' : no operator found which takes a
left-hand operand of type 'const GUID' (or there is no acceptable
conversion) c:\program files (x86)\microsoft visual studio
11.0\vc\include\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;
现在,全部编译,但是我们在 运行 时间内得到一个异常(无效的运算符<)。
我不知道哪里出了问题,如果有人能提供帮助,我会很高兴
当 a
不等于 b
时,显示的比较运算符可以 return false
用于 a<b
和 b<a
.
只需将 memcmp
应用于整个事物并检查结果。
附录(由于 sehe 的评论)。这个问题被标记的 GUID
类型是标准 128 位 UUID 通用唯一标识符 的 Windows API 名称。它是保证 POD,而且保证连续,因为它保证 128 位且每一位都有意义。这使得使用 memcmp
.
是安全的
您的 GUIDComparer 正在比较是否相等。您传递给地图的仿函数必须生成弱排序 - 即它必须比较小或比较大,而不是相等。
这会起作用:
struct GUIDComparer
{
bool operator()(const GUID & Left, const GUID & Right) const
{
// comparison logic goes here
return memcmp(&Left , &Right,sizeof(Right)) < 0;
}
};
您可以考虑使用 Boost.UUID 而不是 Windows SDK 提供的 GUID。
#include <boost/uuid/uuid.hpp>
typedef std::map<boost::uuids::uuid, conn_tuple> conn_map;
boost::uuids::uuid
已经提供了必要的比较运算符,因此您不必按照其他答案中的建议编写排序谓词。
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)
字典定义如下:
typedef boost::tuple<conn_ptr, handler_ptr, rdp_ptr> conn_tuple;
typedef std::map<GUID, conn_tuple> conn_map;
我们遇到编译错误:
Error 9 error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const GUID' (or there is no acceptable conversion) c:\program files (x86)\microsoft visual studio 11.0\vc\include\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;
现在,全部编译,但是我们在 运行 时间内得到一个异常(无效的运算符<)。
我不知道哪里出了问题,如果有人能提供帮助,我会很高兴
当 a
不等于 b
时,显示的比较运算符可以 return false
用于 a<b
和 b<a
.
只需将 memcmp
应用于整个事物并检查结果。
附录(由于 sehe 的评论)。这个问题被标记的 GUID
类型是标准 128 位 UUID 通用唯一标识符 的 Windows API 名称。它是保证 POD,而且保证连续,因为它保证 128 位且每一位都有意义。这使得使用 memcmp
.
您的 GUIDComparer 正在比较是否相等。您传递给地图的仿函数必须生成弱排序 - 即它必须比较小或比较大,而不是相等。
这会起作用:
struct GUIDComparer
{
bool operator()(const GUID & Left, const GUID & Right) const
{
// comparison logic goes here
return memcmp(&Left , &Right,sizeof(Right)) < 0;
}
};
您可以考虑使用 Boost.UUID 而不是 Windows SDK 提供的 GUID。
#include <boost/uuid/uuid.hpp>
typedef std::map<boost::uuids::uuid, conn_tuple> conn_map;
boost::uuids::uuid
已经提供了必要的比较运算符,因此您不必按照其他答案中的建议编写排序谓词。
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)