2016-11-01 6 views
-2

編集:class TFの定義:ファイルとstd :: coutに書き込むために異なる演算子<<()オーバーロードを使用できますか?

class TF { 
    std::vector<V4f> waypoints; 
    std::vector<int> densityWaypoints; 
public: 
    std::size_t size() const { return waypoints.size(); } 
    friend std::ostream& operator<<(std::ostream& str, const TF& tf); 
    friend std::fstream& operator<<(std::fstream& str, const TF& tf); 
    // methods here 
}; 

質問は、それはおそらく前提ですので、私は、ストリームを理解していないという事実からの蒸気があります。

operator<<(std::ostream, T)をオーバーロードすると、画面にデータ構造を表示するために呼び出されたときに1つのオーバーロードが使用され、データ構造がファイルに書き込まれたときに別のものが使用されるようになりますか?

std::ostream& operator<<(std::ostream& str, const TF& tf) { 
    for (std::size_t i = 0; i != tf.waypoints.size(); ++i) { 
     str << " { " 
      << tf.densityWaypoints[i] << " : " 
      << tf.waypoints[i][3] << " : " 
      << tf.waypoints[i][0] << " , " 
      << tf.waypoints[i][1] << " , " 
      << tf.waypoints[i][2] 
      << " } "; 
    } 
    str << "\n"; 
    return str; 
} 

std::fstream& operator<<(std::fstream& str, const TF& tf) { 
    str << (int)tf.size(); 
    for (std::size_t i = 0; i != tf.waypoints.size(); ++i) { 
     str << tf.densityWaypoints[i] 
      << tf.waypoints[i][0] 
      << tf.waypoints[i][1] 
      << tf.waypoints[i][2] 
      << tf.waypoints[i][3]; 
    } 

これは奇妙なエラー(私は疲れてもよい)でコンパイルされません:私は2番目operator<<()オーバーロードを追加するとき

error: no match for ‘operator<<’ (operand types are ‘std::fstream {aka std::basic_fstream}’ and ‘int’)

エラーが発生します。おそらく、このような何か最初のものはうまく動作します。 std::ofstreamstd::fstreamの両方を同じ結果にしようとしました。

しかし、どちらかがうまくいくかどうかはわかりません。確かにint writeTF(std:fstream& str, const TF&tf)のような関数を定義することは可能ですが、私にはC++には向いていません。ここにも表示される奇妙なエラーはもちろんです。

+1

もちろん可能です。 –

+1

エラーが発生した例を教えてください。今すぐ私たちに提示したコードは、さまざまな理由でコンパイルされません。 – 0x499602D2

+0

@ 0x499602D2はクラス定義のショートカットを投稿しました – iksemyonov

答えて

1

私はostreamのアドレスをcoutのアドレスと比較しているコードを見てきました。私はそれについて複雑な気持ちをしているが、それは確かに働いた:

std::ostream& operator<<(std::ostream& o, Foo const&) 
{ 
    if(&o == &std::cout) { 
     return o << "cout"; 
    } else { 
     return o << "not_cout"; 
    } 
} 

demo

注意を標準出力に出力coutが、それは「画面」と同じものではないということ。

+0

「画面」は人間の定義です。 – iksemyonov

+2

@iksemyonov重要なのは、出力を画面からほとんどのOSがあるファイルにリダイレクトできることです。 –

関連する問題