与运营商不匹配>与功能一起使用时

时间:2013-07-13 19:18:39

标签: c++ operator-overloading

我已经重载了以下大于运算符:

bool operator > (Person & a, Person & b)
{
   //firstname is a string data type
   return (a.FirstName > b.FirstName);      
}

如果我有类似以下内容的话,哪个工作正常:

Person a = myPersonA;
Person b = myPersonB;

return myPersonA > myPersonB;

但是,在我的Person类中,我定义了一个Person getByID(int id)函数,该函数按给定的ID返回Person的实例。如果我尝试将我的运算符与此函数的返回值一起使用,如下所示:

bool whosGreater = listPeople.getById(1) > listPeople.getById(2);

我得到"Error: no match for operator >(Person&, Person&)"

但是,如果我执行以下操作,它可以正常工作:

Person a = listPeople.getById(1);
Person b = listPeople.getById(2);
bool whosGreater = a > b;

我有没有在这里看到的东西?在我看来它应该有效。

PS:这是一个家庭作业,所以我可以真正逃脱声明变量并为它们分配函数返回并远离它,但我想知道发生了什么,以便我可以学习。我试过谷歌搜索它,但我无法提出正确的问题。

2 个答案:

答案 0 :(得分:6)

函数返回的值是临时值,而不是“普通”Person对象。临时值只能作为const参数引用传递,因此将参数更改为const引用应该可以正常工作;

bool operator > (const Person & a, const Person & b)
{
   //firstname is a string data type
   return (a.FirstName > b.FirstName);      
}

答案 1 :(得分:5)

成功:

bool operator > (Person const & a, Person const & b)
{
   //firstname is a string data type
   return (a.FirstName > b.FirstName);      
}

普通引用无法绑定到临时对象(如getById()返回的对象)。而且你没有改变传入的对象,所以制作引用const。