为优先队列重载运算符<
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 < right.fvalue);
可能会更简单,并减少您需要维护的公共接口。
【参考方案1】:
关系运算符不应更改操作数。试试:
bool Position::operator<(const Position& right) const
我的猜测是__x
或__y
(或两者)都是const
。如果__x
是const
,则不能在__x
上调用非常量成员函数,如果__y
是const
而right
不是,你也不能将__y
作为right
参数传递.
【讨论】:
【参考方案2】:最好不要为了满足集合而重载比较运算符。 (http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Operator_Overloading)。如果可能,最好使用比较器对象或函数。如果您的操作员定义了这些对象的内在顺序,而不仅仅是它们在队列中的优先级,那么就可以了。但如果不是这样,如果其他开发人员在其他上下文中使用您的运算符,您可能会遇到麻烦。
我不确定fvalue
是什么,但它可能没有为它定义operator <
。
【讨论】:
以上是关于为优先队列重载运算符<的主要内容,如果未能解决你的问题,请参考以下文章