二进制“<”:“const _Ty”不定义该运算符或到预定义运算符可接收的类型的转换

出现此错误的原因分析:

当我们用set插入自定义类型的时候,由于我们没有告诉编译器比较规则,所以编译器不知道该怎么将我们插入的自定义进行排序!

struct CustomType
{
	int m_id;
	std::string m_name;
}

解决办法:

使用全局函数或成员函数重载‘<’

#include <string>
#include <set>
using namespace std;

struct Student
{
	int m_id;
	string m_name;

	Student(int id, string name) :m_id(id), m_name(name)
	{
	}
	//成员函数的写法
	//bool operator<(const Student& other) const
	//{
	//	return m_id < other.m_id ? true : (m_id > other.m_id ? false : (m_name < other.m_name ? true : false));
	//}
};
//全局函数的写法
//排序规则为:m_id从小到大,如果相同则名字从小到大
bool operator<(const Student& m1, const Student& m2)
{
	return m1.m_id < m2.m_id ? true : (m1.m_id > m2.m_id ? false : (m1.m_name < m2.m_name ? true : false));
}

int main()
{
	Student one(1, "xiaoming");
	Student two(2, "xiaohong");
	Student two_copy(2, "xiaohong");

	set<Student> se;
	se.insert(one);
	se.insert(two);
	se.insert(two_copy);  //set容器不会插入相同值!
	return 0;
}

注意事项

  1. operator < 作为成员函数是得声明为const函数,表示不能修改类对象的成员变量,保证被比较的两个对象内容不被修改。
  2. operator< 作为独立函数声明时需要将两个对象都声明为const类型。
  3. 要注意重载 < 符号的时候,在判断大小的地方不能加入 = ,即只能 > 或 < ,不能 >= 和 <= ,因为当插入的是两个相同值,会进入一个死循环!
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫滴感情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值