如何确保二进制布尔运算符正确处理其参数的常量?

时间:2014-01-23 00:33:50

标签: c++ class operators const this

我正在学习C ++,我在理解为什么会出现以下错误时遇到问题:

mst.cpp:27:15: note:   no known conversion for implicit ‘this’ parameter from ‘const State*’ to ‘State*’

相关代码是

class State {
  size_t _node;
  double _dist;
public:
  State( size_t aNode, double aDist ) : _node{aNode}, _dist{aDist} {}
  inline size_t node() const { return _node; }
  inline double dist() const { return _dist; }
  inline bool operator< ( const State& rhs ) { return _dist < rhs.dist(); }
};

和违规行(27)是此类声明的最后一行。为什么代码尝试执行从const到非const State*的转换?鉴于我们不想改变任何事情,它们不应该被对待吗?另外,鉴于const-ness显然很重要,确保示例在没有错误的情况下按预期工作的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

这是我的心灵猜测: 您正在使用Microsoft Visual Studio,并在“错误窗口”中向我们显示了错误。转到View-&gt;输出以查看完整的编译器输出,该输出应该有数百行关于错误的确切内容的详细信息。

继续猜测模式,您将这些State个对象存储在set中,或者您可能sort。无论你做什么,都会尝试使用你的对象的operator<和两个const对象。不幸的是:

inline bool operator< ( const State& rhs )        { return _dist < rhs.dist(); }
                                          ^^^^^^^^

如果左侧不是operator<,则只能调用const。在我标记的位置添加const,这应该可以解决问题。为了避免这个问题,并且出于其他简洁的原因,声明布尔函数的常规方法是通过像这样的友元函数(仍然在类中):

friend bool operator<( const State& lhs, const State& rhs )
{ return lhs.dist() < rhs.dist(); }

由于函数是在类中定义的,因此此处不需要inline关键字,或者您列出的任何函数。