2016-10-26 7 views
3

かなり興味深い問題です。endloを含める場合を除いて、C++のオーバーロードされた<<演算子は正しく出力されません

基本的には、私のクラスの文字列表現を返すために挿入演算子がオーバーロードされています。しかし、std :: endlを含めない限り、プログラムは終了します。キュー[L]:

template<class T> 
std::ostream& operator << (std::ostream& outs, const LinkedQueue<T>& q) { 

    outs << "queue["; 

    if (!q.empty()) { 
     outs << q.front->value; 

     for (auto i = ++q.begin(); i != q.end(); ++i) 
      outs << ',' << *i; 
    } 
    outs << "]:rear"; 

    return outs; 
} 

int main() { 
    QueueType queueType1; 
    queueType1.enqueue("L"); 
    std::cout << queueType1 << std::endl; 
    return 0; 
} 

上記の主は、正しい出力生成

リアをしかし、私はメインから std::endlを削除した場合、プログラムブレークとは何も生成しません。

オーバーロードされたメソッドにendlを含めることはできません。文字列に余分な文字を追加するためです。助言がありますか?

+5

あなたは間違っています。示されたコードには何も問題はありませんが、望むなら 'outs << std :: flush;'を使ってストリームバッファを明示的にフラッシュすることができます。 –

+0

https://stackoverflow.com/questions/22026751/c-force-stdcout-flash-print-to-screenに重複しています – Mine

答えて

1

@samevarshavchikの示唆しているように、std::endlの代わりにstd::flushを使用して、目的の出力を達成してください。これがメインで行うことができます

int main() { 
    QueueType queueType1; 
    queueType1.enqueue("L"); 
    std::cout << queueType1 << std::flush; 
           /*^^^here^^^*/ 
    return 0; 
} 

またはあなたのオーバーロード関数内:

template<class T> 
std::ostream& operator << (std::ostream& outs, const LinkedQueue<T>& q) { 

    outs << "queue["; 

    if (!q.empty()) { 
     outs << q.front->value; 

     for (auto i = ++q.begin(); i != q.end(); ++i) 
      outs << ',' << *i; 
    } 
    outs << "]:rear" << std::flush; 
         /*^^^here^^^*/ 
    return outs; 
} 
関連する問題