为优先队列重载运算符<

Posted

技术标签:

【中文标题】为优先队列重载运算符<【英文标题】:Overloading operator< for priority queue 【发布时间】:2011-09-21 12:05:00 【问题描述】:

我正在尝试为我这样制作的课程创建一个优先级队列 -

std::priority_queue<Position> nodes;

我像这样在 Position 中重载了

bool Position::operator<(Position& right) 
    return (fvalue < right.getFValue());

但是,每当我尝试编译时,我都会收到此错误消息,指出

error: no match for ‘operator<’ in ‘__x < __y’
position.h:30: note: candidates are: bool Position::operator<(Position&)

我在这里缺少什么?任何帮助表示赞赏。

【问题讨论】:

附带说明:return (fvalue &lt; right.fvalue); 可能会更简单,并减少您需要维护的公共接口。 【参考方案1】:

关系运算符不应更改操作数。试试:

bool Position::operator<(const Position& right) const 

我的猜测是__x__y(或两者)都是const。如果__xconst,则不能在__x 上调用非常量成员函数,如果__yconstright 不是,你也不能将__y 作为right 参数传递.

【讨论】:

【参考方案2】:

    最好不要为了满足集合而重载比较运算符。 (http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Operator_Overloading)。如果可能,最好使用比较器对象或函数。如果您的操作员定义了这些对象的内在顺序,而不仅仅是它们在队列中的优先级,那么就可以了。但如果不是这样,如果其他开发人员在其他上下文中使用您的运算符,您可能会遇到麻烦。

    我不确定fvalue 是什么,但它可能没有为它定义operator &lt;

【讨论】:

以上是关于为优先队列重载运算符<的主要内容,如果未能解决你的问题,请参考以下文章

优先队列重载<运算符

优先队列中运算符重载

C++语法小记---运算符重载

简单重载运算符in priority_queue By cellur925

在 C++ 中的重载运算符中使用局部变量

basic code-优先队列