0

が呼び出されるたびに関数を呼び出すつもりm_logger<<"hello"<<"world"です。m_logger はストリーム型です。

だから私は次の署名で << をオーバーロードすることにしました

friend ofstream& operator<<(ofstream &stream,char *str);

ただし、vc コンパイラは次のエラーを返します。

エラー C2666: 'operator <<' : 6 つのオーバーロードに同様の変換があります

これを達成する他の方法はありますか?私の目的は、ofstream オブジェクトへのすべての書き込み操作を別の関数に転用することです

自分のカルスのオブジェクトを作成するのはうまくいきますが、システム定義のすべての型を文字列またはchar *に型キャストする通常のオブストリームオブジェクトのように機能させるにはどうすればよいですか。私は1つのアプローチがすべてのタイプの演算子をオーバーロードすることであることを知っていますが、よりクリーンなアプローチはありますか

4

5 に答える 5

5

「オーバーロード」は「オーバーライド」ではありません。さまざまな型の引数に対して関数または演算子をオーバーロードできます。既存の関数または演算子を独自の実装でオーバーライドすることはできません (仮想関数のオーバーライドは別として、これは明らかに大きく異なります)。唯一の例外はoperator newoperator deleteで、組み込みのものをオーバーライドできます。

于 2009-07-15T01:08:46.093 に答える
2

m_logger オブジェクトのタイプを変更できます。

于 2009-07-15T01:04:07.293 に答える
1

あなたがすべきことは、クラスを作成してから定義することoperator<<です。演算子のオーバーロードには、少なくとも 1 つのユーザー定義型が含まれている必要があります。同様に、新しいoperator+(int, int).

于 2009-07-15T01:16:10.287 に答える