错误C3848:具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool MyCompare::operator ()(int,int)

今天在跟着黑马程序员的视频教程进行c++中map的排序练习,map输出的时候是默认升序输出的,如果想要实现map的降序输出,就需要写一个仿函数来改变默认排序规则,在map构造函数中添加一个自定义的类,在类中定义仿函数。

map<int,int,myCompare>
class myCompare
{
public:
	bool operator()(int v1, int v2)
	{
		//降序
		return v1 > v2;
	}
};

然后进行降序输出:

 void test03()
{
	map<int, int, myCompare>m;
	m.insert(pair<int, int>(1, 10));
	m.insert(pair<int, int>(5, 50));
	m.insert(pair<int, int>(0, 0));
	m.insert(make_pair(4, 40));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(2, 20));
	for (map<int, int, myCompare>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "key= " << (*it).first << "  value=  " << (*it).second << endl;
	}
}

运行之后竟然出现了以下错误:

错误C3848:具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool MyCompare::operator ()(int,int)

就很奇怪,代码和视频中一致,但是视频里却能够正常运行。可能是因为我用的visual studio2019,视频里用的是老版本,在编译检查上增加了一些新的规则?为了定位问题,从源码排查一下:

转到定义,找到了map的一条构造函数:

 template <class _Iter>
    map(_Iter _First, _Iter _Last, const key_compare& _Pred) : _Mybase(_Pred) {
        insert(_First, _Last);
    }

构造函数中,_First 即为 key ,_Last 即为 value 。而 key_compare 被限定为 const 类型,因此我们在为 map 传入参数的时候,仿函数也应该为 const 类型,因此解决方案如下:在仿函数的后面加上关键字 const ,使得 myCompare 作为参数的时候具有 const属性。 

class myCompare
{
public:
	bool operator()(int v1, int v2) const
	{
		//降序
		return v1 > v2;
	}
};

运行成功!

 

  • 31
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值