2016-05-23 9 views
3

クラスを実装するときに、< <を使用してインスタンスにいくつかのパラメータを渡したいと思います。オペレータをオーバーロードする方法ostreamのように動作させる

例えば、

terminal term; 
term << "Hello World!" << '\n'; 

コードを下回る、

class terminal { 
    template <typename T> 
    terminal& operator << (T& t) { 
     std::cout << t; 
     return *this; 
    } 
}; 

基本的に、私の代わりにストリームの一部であるの流れになりたいです。 (< <用語をCOUTない;)などint型、char型、などの数は(存在する場合

(そのため申し訳ありませんが、私は私の質問を指定するのを忘れて) 質問は、それは文字列でよく働いているが、それはコンパイルに失敗しました)。

我々は上記の例を使用している場合、コンパイラはバイナリ表現(「末端」と「INT」)へ

無効なオペランドが

+2

そして、あなたが持っているコードに問題がありますか? – Angew

+4

'T&t'はそれを' const T& 'にして、あなたは設定する必要があります。 –

+0

エラーを生成したコードも投稿できますか? – Angew

答えて

1

私は次、operator<<の配列決定のための順序で(例えば、term << "hello" << std::endl;)動作するようにに変更します

namespace foo { 

class terminal {  
    std::ostream &strm; 
public: 
    terminal(std::ostream &strm_) : strm(strm_) {} 
    terminal() : strm(std::cout) {} 

    template <typename T> 
    friend std::ostream& operator<<(terminal &term, T const &t); 
}; 

template <typename T> 
std::ostream& operator<<(terminal &term, T const &t) { 
    term.strm << t; 
    return term.strm; 
} 

} 

Live Demo

+0

ありがとうございます。この実装は、ostreamを、私のものよりも優れているとみなします。 – 0xBBC

1

問題は、あなたのoperator <<がかかることであると文句を言うだろう引数は非constへの参照で、これはlvaluesにのみバインドできることを意味します。だから、非文字列リテラルのようなものが出てきます。引き数を変更する必要がない場合は、代わりにconst &としてください。この言語には、左辺値の参照constへの参照を右辺値にバインドする特別な規則があります。

terminal& operator << (const T& t) { 
    std::cout << t; 
    return *this; 
} 

あなたは<<とは異なるアプローチを使用して、引数を変更する必要がある操作を行い場合。 <<の間にストリーミングされた引数を変更するようなストリームのようなインターフェイスは、非常に直観的でなく、メンテナンスの悪夢となります。

関連する問題