std::set FIND操作,报错invalid operator <

西昆仑 发布于 2012/04/20 15:51
阅读 1K+
收藏 0

我在使用标准模板库元素的时候,有如下定义:

set<UUID, UUID_LESS> m_waitIdSet;

class _declspec(dllexport) UUID_LESS
{
public:
	bool operator()(const UUID& srcUuid, const UUID& destUuid)const
	{
		 int nCmpRet = memcmp(&srcUuid, &destUuid, sizeof(UUID));

		 if (nCmpRet > 0)
		 {
				return false;
		 }else
		 {
				return true;
		 }
	}
};

在这句代码中:

m_waitIdSet.find(qMsg.reciptId) != m_waitIdSet.end()

报错:invalid operator < 

但是查看了一下. m_waitIdSet里是有数据的。qMsg.reciptId也是有数据的。

加载中
0
Jackarain
Jackarain
UUID_LESS 这命名, 着实让哥无话可讲...
Jackarain
Jackarain
回复 @西昆仑 : 看到你这个代码的命名, 最讨厌大写命名, 除宏之外. 本来我是不想看下去的. 不过我还是忍不住告诉你, set,map容器都遵循严格的弱排序规则, 也就是说其内部比较是以小于为准则的, 不可以两个item比较时, 不可以出现互相小于的情况. > 改为 >= 就好了.
Jackarain
Jackarain
回复 @西昆仑 : 同时插入2条相同的, 你想会怎么样?
西昆仑
西昆仑
给点实际有用的意见吧
0
Anghan
Anghan

std::set的 < 需要满足严格弱序化

0
汉克斯
汉克斯
你贴的代码和报的错误“  invalid operator < ” 没什么必然联系,你还是贴出你用到<操作符地方的代码吧。
汉克斯
汉克斯
回复 @西昆仑 : 你是编译报错还是运行报错?我怎么觉得是编译报错呢?但是你说什么watIdSet里有数据,那是指的运行报错?我一直没揣测到你想表达什么意思。如果是编译报错,把IDE提示的编译全部贴出来。包括错误编号之类的信息。不然确实不怎么好帮到你
西昆仑
西昆仑
这个是用到set的代码
西昆仑
西昆仑
if (m_waitIdSet.find(qMsg.reciptId) != m_waitIdSet.end()) { m_idSignal.ReleaseSignal(); }else { m_inertSignal.ReleaseSignal(); }
0
汉克斯
汉克斯

回答你们这些说半截的问题真是要死很多脑细胞啊。

我初步估计是,你需要在class _declspec(dllexport) UUID_LESS 里自己重新实现一次operator < 操作符。

返回顶部
顶部