error C2678: 二进制“<”: 没有找到接受“const _Ty”类型的左操作数的运算符
今日老友问我一个 c艹 的报错问题,如下两个版本,一个对,一个错:
可以编译通过:
#include <algorithm>
#include <iostream>
using namespace std;
struct Stu
{
int age;
bool operator<(const Stu& s)
{
return age > s.age;
}
};
int main()
{
Stu arr[2];
arr[0].age = 6;
arr[1].age = 8;
sort(arr, arr + 2); // [arr,arr+2)
for (auto& item : arr)
{
cout << item.age << ' ' ;
}
return 0;
}
如上正常使用,没有报错。
我们知道 sort 缺省函数为 less,如下模板类:
template<>
struct less<void>
{ // transparent functor for operator<
typedef int is_transparent;
template<class _Ty1,
class _Ty2>
constexpr auto operator()(_Ty1&& _Left, _Ty2&& _Right) const
-> decltype(static_cast<_Ty1&&>(_Left)
< static_cast<_Ty2&&>(_Right))
{ // transparently apply operator< to operands
return (static_cast<_Ty1&&>(_Left) < static_cast<_Ty2&&>(_Right));
}
};
重点看这句话,参数类型非 const。
auto operator()(_Ty1&& _Left, _Ty2&& _Right)
然后我们再看下文报错的情况
但是如果老友使用 set 函数:
error C2678: 二进制“<”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
struct Stu
{
int age;
bool operator<(const Stu& s)
{
return age > s.age;
}
};
int main()
{
set<Stu> my_set;
my_set.insert(Stu{ 6 });
my_set.insert(Stu{ 8 });
for (auto& item : my_set)
{
cout << item.age << ' ' ;
}
return 0;
}
修改以下,可以编译通过了:
bool operator<(const Stu& s) const // 添加 const
老友问我为什么?
我们可以通过观察报错说明来看:
有一句话:编译 类 模板 成员函数 "bool std::less<_Kty>::operator ()(const _Ty &,const _Ty &) const" 时******
因为我们自定义了 Stu 类的排序规则,即重载了 operator<.
Set 内部排序缺省函数位 less
我们去看一下类模板 less
template<class _Ty = void>
struct less
{ // functor for operator<
constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
{ // apply operator< to operands
return (_Left < _Right);
}
};
看到参数是 const _Ty& _Left, const _Ty& _Right,所以传入的 this 对象引用变成 const _Ty& _Left,而 _Left 是 const 导致无法调用非 cosnt 成员函数 opertator<。所以需要添加 const 使其变成 const 成员函数
关于const的作用:
表示成员函数隐含传入的this指针为const指针
后面加 const表示函数不可以修改class的成员
https://blog.csdn.net/SMF0504/article/details/52311207
============
当我沉默时,我觉得充实。当我开口说话时,却觉得空虚
===========