0

次のように、特定のファイル cfileop.cpp で ofstream 演算子をオーバーロードしました。

std::ostream& operator<<(std::ostream& ofs, LPCWSTR wideString)
{
    //ofs << ConvertUnicodeToUtf8(wideString).GetBuffer();
    ofs << CW2A(wideString,CP_UTF8);
    return ofs;
}

この特定のファイルでは、オペレーターを使用して行われる呼び出しはすべて完璧に機能します。まったく問題ありません。

ただし、この同じ演算子を別のファイルにオーバーロードする必要があります。この呼び出しを別の場所 acrazyapp.cpp で繰り返すと、次のような出力が得られます。

02962AE010021A3402961018
029621C010021A3410022AF0
029621C010021A34029619D0
029621C010021A3410022A68

これは、オーバーロードの場所を acrazyapp.cpp に切り替えるだけで解決できると思いました。ただし、これにより cfileop.cpp が正しく出力されませんでした。両方を満たすために、呼び出しをヘッダー ファイル ch_ofstream.h に移動し、両方の cpp ファイルに含めました。ただし、この場合、次のエラーを受け取りました: 致命的なエラー LNK1169: 1 つ以上の複数定義されたシンボルが見つかりました。

cpp ファイルを結合せずに、上記の ofstream 演算子が両方の cpp ファイルで適切にオーバーロードされていることを確認するにはどうすればよいですか?

ありがとうございました!

4

1 に答える 1

1

operator<<(void*)オーバーロードは他のファイルで宣言されていないため、ポインタが指すアドレスを出力するを呼び出すことになります。

他の関数と同様に、1 つのヘッダー ファイルで宣言し、1 つのソース ファイルで実装する必要があります。

于 2013-08-22T00:47:19.523 に答える