1

私は簡単なセットアップをしています:

#include<iostream>

class Stuff {};

ostream &operator<<(ostream &lhs, const Stuff &rhs) {
    return lhs << "something";
}

int main() {
    Stuff stuff;

    cout << stuff << endl;
    cin.get();
}

ここで、operator<<関数はモックアップStuffクラスを に出力しostreamます。私がやりたいことは、その関数をStuffクラス自体に移動することです。次のように:

class Stuff {
    ostream &operator<<(ostream &lhs, const Stuff &rhs) {
        return lhs << "something";
    }
};

しかし、私の人生では、これを機能させる方法がわかりません。左結合演算子を右から再定義しようとしているような気がします。これを適切に行う方法はありますか?

4

1 に答える 1

3

あなたが定義した方法では、その関数は のメンバーになるStuffため、C++ で許可されている場合は、次のように呼び出す必要があります。

Stuff stuff;
stuff.operator<<(std::cout, stuff);

だからあなたはそれを望んでいません。

二項演算子 ( など<<) は、2 つの引数 (オペランドと呼ばれます) を取ります。(非静的) メンバー関数の場合は、1 つのパラメーターを受け取るメンバー関数である必要があります。左のオペランドは関数を呼び出すオブジェクトであり、右のオペランドは関数パラメーターです。だからあなたはこれを行うことができます:

struct Stuff {
  std::ostream& operator<<(std::ostream& o) { return o << something; }
};

Stuff s;
s << std::cout << std::endl;

しかし、あなたはおそらくそれも望んでいません!

演算子を記述するstd::cout << sには、左オペランドのメンバーであるか、非メンバー関数でなければならないため、 のメンバーにすることはできませんStuff

たぶん、あなたがやろうとしていることはこれです:

class Stuff {
    friend std::ostream& operator<<(std::ostream& lhs, const Stuff& rhs) {
        return lhs << "something";
    }
};

関数はメンバー関数でfriendはないため、これは有効です。

于 2013-09-05T16:59:05.590 に答える