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

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

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也是有数据的。

举报
西昆仑
发帖于6年前 4回/1K+阅
共有4个答案 最后回答: 6年前
UUID_LESS 这命名, 着实让哥无话可讲...
--- 共有 3 条评论 ---
Jackarain回复 @西昆仑 : 看到你这个代码的命名, 最讨厌大写命名, 除宏之外. 本来我是不想看下去的. 不过我还是忍不住告诉你, set,map容器都遵循严格的弱排序规则, 也就是说其内部比较是以小于为准则的, 不可以两个item比较时, 不可以出现互相小于的情况. > 改为 >= 就好了. 6年前 回复
Jackarain回复 @西昆仑 : 同时插入2条相同的, 你想会怎么样? 6年前 回复
西昆仑给点实际有用的意见吧 6年前 回复
你贴的代码和报的错误“  invalid operator < ” 没什么必然联系,你还是贴出你用到<操作符地方的代码吧。
--- 共有 3 条评论 ---
汉克斯回复 @西昆仑 : 你是编译报错还是运行报错?我怎么觉得是编译报错呢?但是你说什么watIdSet里有数据,那是指的运行报错?我一直没揣测到你想表达什么意思。如果是编译报错,把IDE提示的编译全部贴出来。包括错误编号之类的信息。不然确实不怎么好帮到你 6年前 回复
西昆仑这个是用到set的代码 6年前 回复
西昆仑 if (m_waitIdSet.find(qMsg.reciptId) != m_waitIdSet.end()) { m_idSignal.ReleaseSignal(); }else { m_inertSignal.ReleaseSignal(); } 6年前 回复

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

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

顶部