重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

いつもお世話になっております。よろしくお願いします。C++のプログラミング暦、半月です。

構造体Sのvector、Vを考えます。
struct S{
  string   strA;
  string   strB;
  int    intData;
  double   doubleData;
};
vector<S> V;

ここで、「Vを、intDataの昇順(第1キー)とdoubleDataの昇順(第2キー)にソートして、最初の要素のstrAとstrBを返す。」処理をしたいです。
それで、イテレータの中でintDataを比較する演算子を以下の通り定義しました。
bool operator < ( const S& left, const S& right ){
  return S.intData < S.intData;
}

ですが、次のエラーがでました。引数を2つとる例も見たことがあるのですが、上記定義のどこがおかしいのかがわかりません。
error: `bool XXX::operator>(const S&, const S&)' must take exactly one argument

ちなみにLinux(RedHatEnterprise系)で、コンパイラはgcc3.4.3です。

A 回答 (3件)

bool operator < ( const S& left, const S& right )をXXXのメンバ関数として定義していませんか?


bool operator < ( const S& left, const S& right )は非メンバ関数として定義する必要があります。
    • good
    • 0
この回答へのお礼

早速のご回答、ありがとうございました。ご指摘通り、XXXのメンバ関数としていました。これを、クラスの外で定義すればよいということですね。今、質問した時の環境がないので確認できませんが、そうすると構造体Sの定義もクラスの外でしないといけなくなるのでしょうか。

お礼日時:2007/10/20 20:29

アクセスする対象が public であれば、グローバルに定義できます。


もしくは、メンバ関数宣言で friend 宣言をつける必要があります。
    • good
    • 0
この回答へのお礼

御礼が遅くなって、どうもすみません。実機で確認しました。どうもありがとうございました。

お礼日時:2007/10/24 01:43

とりあえず、S.intData とか書いてあるのは left.intData の typo ですか?


そしてエラーメッセージの演算子の向きが逆になっていますが。

この回答への補足

すみません、質問用に表現を修正した時に2箇所間違えてしまいました。

  return S.intData < S.intData;
は、
  return left.intData < right.intData;
の間違いでした。

< と > の2つ作って、同じエラーが出たのですが、質問用に転記した時に、エラーメッセージだけ > の方を転記していました。

よろしくお願いします。

補足日時:2007/10/20 19:10
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございました。補足にて訂正しましたので、よろしくお願いします。

お礼日時:2007/10/20 19:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!