我正在学习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显然很重要,确保示例在没有错误的情况下按预期工作的最佳方法是什么?
答案 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
关键字,或者您列出的任何函数。