問題は、最初のパラメータではなく、2番目のパラメータとして使用するoperator<<
ことです。ostream
そうすればできますが、直感的ではないように見え、結合性が残っているmyObject << std::cout
ために呼び出しを連鎖させることができません。operator<<
メンバー関数ではなく、演算子をフレンドとして宣言することのもう1つの利点は、自動変換が発生する可能性があることです。つまり、B
派生していないA
がコンストラクターを持っているクラスがある場合でも、それを実行して、に変換してから出力するB(A const&)
ことができます。std::cout << my_b;
A
幸い、必要に応じて、クラス内で友達として定義するoperator<<
ことができます。あなたのコードは次のように書くことができます
class A {
int i;
friend std::ostream& operator<<(std::ostream& o, A const& a) {
o << a.i;
return o;
}
};
なぜ標準では、引数をどちら側に進めるかを指定できないのですか?それが行われたふりをして、指定するキーワードleft_of
とキーワードを追加しましょう。right_of
struct B;
struct A {
A left_of operator+(B const&) {
return *this;
}
};
struct B {
B right_of operator+(A const&) {
return *this;
}
};
私たちがやると今何が起こりますA a; B b; f(a + b);
か?各クラスには、このケースを処理する演算子があります。つまり、決定できません。とにかく変換の可能性があるため、多くのオペレーターが友達になるはずですが、この種のことを許可しないことはそれほど大きな問題ではなく、この種のあいまいさを防ぎます。(もちろん、メンバー演算子と無料の演算子を定義することもできます。これにより、非常によく似た問題が発生します。)
ちなみに、物事がそうであるように、あなたの定義はfriend operator<<
何も返さないので、連鎖を台無しにします。