ホームページ >バックエンド開発 >C++ >` をオーバーロードすると、「std::endl」によって「不明な型」エラーが発生するのはなぜですか

` をオーバーロードすると、「std::endl」によって「不明な型」エラーが発生するのはなぜですか

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-07 04:40:11869ブラウズ

Why Does

演算子の「std::endl は不明なタイプです」エラーを解決する<<オーバーロード

演算子のオーバーロードは C の強力な手法であり、カスタム データ型で "<<" などの演算子に対する独自の動作を定義できるようになります。ただし、演​​算子「<<」をオーバーロードする場合、「std::endl」を使用するときに問題が発生する可能性があります。

「my_stream << endl」を使用する場合のコンパイル エラーの根本原因は、「 std::endl" はデータ型ではなく関数として定義されます。これを解決するには、「std::cout」が「std::endl」をどのように処理するかを理解する必要があります。

「std::cout」では、演算子「<<」一致するシグネチャを持つ関数ポインタを「std::endl」として受け入れるように実装されています。これにより、「std::cout」が関数を呼び出して戻り値を転送できるようになります。この概念を使用して、カスタム ストリーム「MyStream」にも同様のアプローチを実装できます。

「MyStream」のカスタム endl の実装

「」という名前の新しいメンバー関数を導入します。 endl" を演算子 "<<" と同じ署名で "MyStream" に変換します。 「MyStream::endl」内で、改行の印刷など、ストリームに固有のカスタム操作を実行できます。

標準 EndLine 署名の一致

「std」をサポートするには::endl" を使用するには、別の "operator<<" を定義する必要があります。 「std::cout::endl」のシグネチャと一致する関数ポインターを受け入れます。これにより、戻り値をシームレスに転送しながら、「MyStream」から直接「std::endl」を呼び出すことができます。

コード例:

#include ;

struct MyStream {
// ... (same as previous code)

// MyStream's custom endl
static MyStream& endl(MyStream& stream) {
// ... (same as previous code)
}

// Operator<< to accept std::endl
MyStream& operator<<(StandardEndLine manip) {
// ... (same as previous code)
}
};

int main(void) {
MyStream stream;

// ... (same as previous code)
stream << MyStream::endl; // Call custom endl
stream << std::endl; // Call std::endl directly

return 0;
}

これらを実装することで、メソッドを使用すると、コンパイル エラーが発生することなく「my_stream << endl」を使用できるようになります。演算子「<<」をカスタマイズするときは、「std::endl」の基礎となる実装を理解することが重要であることに注意してください。独自のストリームクラス用。

以上が` をオーバーロードすると、「std::endl」によって「不明な型」エラーが発生するのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。