4

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

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:这是一个家庭作业,所以我真的可以摆脱声明变量并将函数返回的内容分配给他们并摆脱它,但我想知道发生了什么以便我可以学习。我试过用谷歌搜索它,但我想不出正确的问题。

4

2 回答 2

6

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

bool operator > (const Person & a, const Person & b)
{
   //firstname is a string data type
   return (a.FirstName > b.FirstName);      
}
于 2013-07-13T19:22:21.560 回答
5

做了:

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

普通引用不能绑定到临时对象(如 getById() 返回的对象)。而且您不会改变传入的对象,因此请将引用设为 const。

于 2013-07-13T19:25:58.917 回答