演算子のオーバーロード<< std::endl
を処理する ストリーム挿入演算子 (operator<<) をオーバーロードする場合、std::endl を挿入引数として含めようとすると、一般的な問題が発生します。エラー「エラー C2678: バイナリ '
このエラーの根本的な理由は、std::endl が型ではなく関数であることです。これを克服するには、std::cout が std::endl をどのように処理するかを理解する必要があります。 std::cout は演算子<<を実装します。 std::endl と同じシグネチャを持つ関数ポインタを取得します。次に、関数を呼び出して戻り値を転送します。
この動作をエミュレートするには、追加の演算子を定義します
カスタム MyStreamManipulator シグネチャを持つ関数を受け取る MyStream クラス内の関数。この関数は、指定された関数を呼び出し、その戻り値を返します。
特に std::endl を処理するために、MyStreamManipulator シグネチャと一致する静的 MyStream::endl 関数を定義します。この関数内で、新しい行を出力し、バッファのフラッシュなどの追加のストリーム操作を実行します。
さらに、演算子<<を定義します。 std::cout で使用される StandardEndLine 関数シグネチャを受け入れる関数。この関数は、std::cout を引数として manip 関数を呼び出し、std::endl の挿入を可能にします。
これらの手順に従うことで、operator<< をオーバーロードできます。カスタム MyStream クラスで、ユーザー定義データと std::endl の挿入の両方を処理します。これにより、ストリーム操作を完全に制御できる std::cout の多用途な代替手段として MyStream を使用できるようになります。以上がオーバーロードする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。