C++使用greater报错‘this‘ argument has type ‘const xxx‘, but method is not marked const的解决方案

使用STL的时候难免遇到需要自己定义排序函数的时候,这时候greaterless就能起到很大作用。但之前排序的对象都是基本类型(或者基本类型的容器),这次要给自定义类型排序,就遇到了问题。

比如,我有这么一个场景,我想要给二维空间里的点做一个优先队列,从大到小排个序;所以我先定义一个Point类。因为需要进行大于的比较,所以我重载一个>运算符:

class Point
{
    int val, x, y;
    Point(int val, int x, int y) : val(val), x(x), y(y) {}
    bool operator>(const Point &p) const { return val > p.val; }
};

然后再定义一个优先队列(用STL的优先队列):

priority_queue<Point, vector<Point>, greater<Point>> q;

到这里都没什么问题。然后我插入一个坐标为(1, 1),值为1的点:

q.emplace(1, 1, 1);

然后就报错了。

找了半天也不知道为啥,后来查了一下greater的文档,看到里面是这么写的:

std::greater::operator()

bool operator()( const T& lhs, const T& rhs ) const;(until C++14)
constexpr bool operator()( const T& lhs, const T& rhs ) const;(since C++14)

Checks whether lhs is greater than rhs.

然后我意识到,greater的内部实现是一个const的成员函数,也就是常成员函数。而我们知道,常成员函数是不能调用普通的成员函数的。原因很简单,因为常成员函数是保证不会修改成员变量的,而普通成员函数不保证是否会修改成员变量,如果常成员函数调用了普通成员函数,就有可能会出现声明和实际行为不一致的情况(声明保证不会修改,却偷偷把值给改了),这种情况是不允许出现的,所以就报错了。

解决办法也很简单,加个const,声明为常成员函数就行了:

class Point
{
    int val, x, y;
    Point(int val, int x, int y) : val(val), x(x), y(y) {}
    bool operator>(const Point &p) const { return val > p.val; }
};

另外,参数里的const也是不能少的。为啥呢,理由还是和刚才一样,greater在调用的时候传入的lhs和rhs都是常量,如果我重载的运算符的参数为非常量,相当于把常量赋值给非常量,显然是不行的。

### 解决 PyCharm 中关于 Microsoft Visual C++ 14.0 或更高版本的要求的报错问题 当遇到 `Microsoft Visual C++ 14.0 or greater is required` 的错误提示时,表明当前环境中缺少必要的编译工具来构建某些 Python 扩展包。为了彻底解决问题并确保开发环境稳定运行,建议按照以下方法操作: #### 下载并安装 Microsoft C++ Build Tools 访问官方网站获取最新版的 Microsoft C++ Build Tools 是最直接有效的方法之一。通过该工具集可以满足大多数情况下对于 C/C++ 编译的需求。 前往微软官方页面下载链接[^3]: ```plaintext https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ ``` 启动浏览器访问上述网址,在页面中找到对应的下载按钮完成安装程序的获取。执行下载后的文件依照向导指示逐步进行安装过程即可。 #### 配置系统环境变量 成功安装之后还需要确认系统的 PATH 环境变量已包含新安装的 MSBuild 工具路径。通常情况下,默认设置已经足够;但如果仍然存在问题,则可能需要手动调整环境配置以确保命令行能够识别 vcvarsall.bat 文件的位置。 可以通过编辑系统属性中的高级选项卡下的“环境变量”,将 `%ProgramFiles(x86)%\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build` 添加至 Path 列表内[^4]。 #### 更新 pip 和 setuptools 有时旧版本的 pip 及其配套组件也可能引发兼容性问题,因此推荐更新这些工具到最新版本再尝试重新安装所需的 Python 库。 使用如下命令来进行升级: ```bash pip install --upgrade pip setuptools wheel ``` #### 测试修复效果 最后一步是在终端窗口里再次输入之前失败过的指令测试是否解决了这个问题。如果一切顺利的话应该不会再看到类似的警告信息了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值