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 に答える