4

私はこのようなクラスを定義しました

using namespace std;
class foo {
public:
  typedef std::pair< int, int > index;
  bool operator == ( const index &l, const index &r )
  {
    return (l.first == r.first && l.second == r.second);
  }
  void bar()
  {
    index i1;
    i1.first = 10;
    i1.second = 20;
    index i2;
    i2.first = 10;
    i2.second = 200;
    if (i1 == i2)
       cout << "equal\n";
  }
};

ただし、Windowsでこのエラーが発生します

error C2804: binary 'operator ==' has too many parameters

Linuxでのこのエラー

operator==(const  std::pair<int, int>&, const std::pair<int, int>&)’ must take exactly one argument

このトピックのオーバーロード演算子==は「引数を1つだけ取る必要があります」と文句を言っていることがわかりました。これは、クラス内の静的関数と非静的関数の問題のようです。でも応募方法がわからないthis

たとえば、これは正しくありません

  bool operator == ( const index &r )
  {
    return (this->first == r.first && this->second == r.second);
  }

どうすれば修正できますか?

4

4 に答える 4

5

は、次のoperator==2つの方法で実装できます。

  • thisメンバー関数として:この場合、関数は1つの引数を取り、関数へのポインターとして暗黙的に渡される左側のオペランドで呼び出されます。
  • 非メンバー関数として、この場合、関数は2つの引数、左と右のオペランドを取ります。

を実装しているoperator==ためstd::pair、(の)メンバー関数として実装することはできませんstd::pair。残されたオプションは非メンバー関数です。

したがって、クラスの外で次のように実装します。

bool operator==(std::pair<int,int> const & l, std::pair<int,int> const & r)
{
    return (l.first == r.first && l.second == r.second);
}

ただし、別の方法で実装する場合を除いて、実際に自分で実装する必要はありません。標準ライブラリは、上記のように、辞書式順序でペアの値を比較する、つまり、と比較する汎用バージョンをすでに提供しています。それらを異なる方法で比較する必要がある場合は、独自の特定の定義(非テンプレートバージョン)を提供してください。operator==std::pairfirstfirstsecondsecond

上記の点はoperator==、定義されたタイプに必要なときに実装する方法に関して注目に値します。

于 2013-01-20T09:44:40.433 に答える
3

operator==クラスfooから移動する必要があります。

bool operator == ( const foo::index &l, const foo::index &r )
{
  return (l.first == r.second && l.second == r.second);
}

class foo {
public:
   typedef std::pair< int, int > index;
  void bar()
  {
    index i1;
    i1.first = 10;
    i1.second = 20;
    index i2;
    i2.first = 10;
    i2.second = 200;
    if (i1 == i2)
       cout << "equal\n";
  }
};

また、すでにstd::pair過負荷になっていることに注意してください。リンクを参照してください。必要に応じて、自分で書き直すことを検討してください。operator==

于 2013-01-20T09:45:47.123 に答える
2

クラス内で演算子をオーバーロードする場合==は、現在のオブジェクトと引数の間で比較を実行できるように、単一のパラメーターのみを受け取る必要があります。

于 2013-01-20T09:40:56.120 に答える
2

その演算子をクラスの外に移動することができます。そうすれば、2つのオペランドを取ることができます。実際、クラス自体ではなくメンバー変数のみを比較しているため、この時点でクラス内に保持する意味はありません。

pair確かに、あなたが書いた演算子をすでに定義していても驚かないでしょう。

編集:うん、pairすでにこれを実装しているようです

両方のオブジェクトの最初の要素が互いに等しく比較され、両方の2番目の要素も互いに等しく比較される場合、2つのペアオブジェクトは等しく比較されます-それらはすべて一致する必要があります。

ps私はあなたが意味したと思います

return (l.first == r.first && l.second == r.second);
                    ^^^^^^
于 2013-01-20T09:45:02.103 に答える