6

次のような構造体があります。

sturct person
{
    string surname;
    person(string n) : surname(n) {};
}

と をオーバーロードする必要がoperator<<ありstd::ostreamますperson。私はこの関数を書きました:

std::ostream operator<<(std::ostream & s, person & os)
{
    s << os.surname;
    return s;
}

しかし、私はこのエラーを受け取ります:

/usr/include/c++/4.6/bits/ios_base.h|788|エラー: 'std::ios_base::ios_base(const std::ios_base&)' は非公開です|

/usr/include/c++/4.6/bits/basic_ios.h|64|エラー: このコンテキスト内

/usr/include/c++/4.6/ostream|57|注: 合成されたメソッド 'std::basic_ios::basic_ios(const std::basic_ios&)' がここで最初に必要です |

4

3 に答える 3

18

std::ostreamコピー構築可能ではなく、値で戻るとコピー構築です。戻り値の最適化は、実際にはコピーが作成されない可能性があることを意味しますが、コンパイラーは依然としてコピーが可能であることを要求します。

この演算子の正規の戻り値は、非 const 参照によるものです。

std::ostream& operator<<(std::ostream& o, const SomeType& t);
于 2012-08-23T10:28:03.447 に答える
3

参照によるリターン:

std::ostream& operator<<(...)
          //^

それ以外の場合、 をコピーしようとしてsおり、 s はコピーできません (コピー コンストラクターostreamにアクセスしようとしているというエラー メッセージが表示されます)。private

于 2012-08-23T10:25:03.743 に答える
2

戻り値の型の参照を忘れました:

std::ostream &operator<<(std::ostream & s, person & os)
{
    return s << os.surname;
}
于 2012-08-23T10:25:03.230 に答える