2017-10-19 25 views
1

私は高低を検索しましたが、答えが見つかりませんでしたので、これが重複している場合はご容赦ください。C++演算子<< std :: ostreamの代わりにostreamを呼び出す

私はこの千年紀に軽く変換しようとしている非常に古いC++コードを持っています。コードはVisual Studio 6でまだコンパイルされていますが、これを続行する必要がありますが、Visual Studio 2017でも動作させるようにしようとしています。これを前に行いましたが、ヘッダーファイルなどに多くの変更を加えました。より測定されたアプローチを試みる。

このコードでは、すでにstlとnon-stl、古いものと新しいioヘッダなどが混在しているため、爆発するのを待っています。

簡単なスタートとして、iostream.hをiostreamに置き換えて、どうなるかを確認しました。私はいくつかのコンパイルエラーを持っています。コードには:: ostreamがあり、それをstd :: ostreamに変更するとその問題は解決しました。次に、オーバーロードされた< <演算子の問題が発生しました。その中のすべてのビットがstd :: iostreamを使用していますが、< <コマンドが代わりにostream(またはbasic_ostream)を使用しようとしているようです。

私には何が欠けていますか?古いioクラスをインポートしているヘッダファイルをいくつか変更しなければならないと思います。私はあなたがクラスのヘッダーファイル内の関数の本体を実装する場合その場合は知っているがいけない

inline std::ostream& operator<<(std::ostream& os, const PrinterOption& po) 
{ 
    os << "(" << po.Installed() << ", " << po.Enabled() << ")"; 
    return os; 
} 
+0

'PrinterOption'または' PrinterInfo'は別の名前空間にありますか? – Slava

+0

はい、このコードのほとんどは90年代に書かれているので、一般的な名前空間では何も指定されていません。 –

+0

だから、このコードの問題は何ですか?あなたはどんな結果を期待していますか、何を観察していますか?その2つの違いは何ですか?あなたは、コンパイラエラー、予期しない出力、何か他のものを取得しますか? –

答えて

1

inline std::ostream& operator<<(std::ostream& os, const PrinterInfo& pi) 
{ 
    os << pi.Idx() << ": " << pi.Name() << ", " 
      << PrinterInfo::MapPrinterType(pi.GetPrinterType()) << ", " 
      << PrinterInfo::MapPaperType(pi.GetPaperType()) << ", " 
      << PrinterInfo::MapPrintFormat(pi.GetPrintFormat()) << ", " 
      << PrinterInfo::MapRasType(pi.GetRasType()) << ", " 
      << PrinterInfo::MapNPS(pi.NPS()) << ", " 
      << "dpx = " << pi.Duplex() << ", " 
      << "tray = " << pi.Tray2() << ", " 
      << "port = " << pi.PortNo(); 

    return os; 
} 

PRINTERINFOクラスは、同様に< <演算子のオーバーライドを持っていますインラインキーワードを削除すると、私は同様の問題を抱えていました。これを実現するために、2〜3日とたくさんの記録が無駄になりました...

+0

私はそれを試してみましょう。 –

+0

に移動します。これらの2つの演算子をcppファイルに移動して動作させました。ありがとう! –

+0

正確には、これはインクルードエラーです。なぜなら、小さな関数を何回も呼び出すオーバーヘッドを避けるために、インライン関数が実際に関数の本体をコピーしているからです。したがって、リンカーは、他の場所ですでに使用されているヘッダーファイルの複数のインクルードについて論理的に不平を言います。 –

関連する問題