2012-01-06 15 views
0

いいえ、私はこのコードの仕事を得ることができません: 私は私のカスタムマニピュレータを連結したいと思います。 と呼ばれるので、cout << endlが呼び出されます。 例えば、私は、この欲しい:ここ演算子のオーバーロードとマニピュレータの作成?

emit << event1 << event2 << event3; 

が私のコードです:

class Emit 
{ 
public: 
       // ... 
    const void operator<<(const Event& _event) const; 
}const emit; // note this global 

inline const void Emit::operator<<(const Event& _event) const 
{ 
    Start(_event); 
} 


class Event 
{ 
       // ... 
     const Event& Event::operator<<(const Event& _event) const; 
}; 

inline const Event& Event::operator<<(const Event& _event) const 
{ 
    return _event; 
} 

私はこれを呼び出すカントしかし:

emit << event1 << event2 << event3; 

私はeather、リンク時間をコンパイル時のエラーを受信して​​いますがエラーと私のコードで何が変わったのか、私は対応したエラーに成功しません。

例えば

これ:「< <」バイナリ:

エラー1つのエラーC2679「CONST EventHandling ::イベント」タイプの 右側のオペランドをとりないオペレータが見つからない(あるいはあります 受け入れ可能な変換)C:プロジェクト\ Visual Studioの 2010 \ \ユーザーません\管理\ドキュメント\ cppsystem \ eventhandling \ 18の

感謝TEST.Hたくさん。

答えて

2

これらの演算子は、左から右に呼び出されます。そのため、最初の呼び出し(emit << event1は)Emitへの参照を返す必要があります。

class Emit 
{ 
public: 
    // ... 
    Emit const& operator<<(const Event& _event) const; 
}const emit; // note this global 

Emit const& Emit::operator<<(const Event& _event) const 
{ 
    Start(_event); 
    return *this; 
} 

そして今、あなたはもうあなたのEventクラスでoperator<<をオーバーロードする必要はありません。

+0

ahahah:D私は今それを得る、ありがとうたくさんのXeo、あなたはちょうど私のキーボードの命を救った!あなたのコードは魅力のように動作します。 – codekiddy

1

マニピュレータにデータが含まれていない場合は、実際に関数を書くことができます。例えば、std::endlはおおよそ次のように実装されている(文字を変換するためには、いくつかの魔法手配しないためにも広い流れに対処する必要があると):

std::ostream& endl(std::ostream& out) { 
    (out << '\n').flush(); 
    return out; 
} 

あなたのマニピュレータは、いくつかのデータを持っている場合は、保存する必要がありますたとえばstd::setw()に適したオブジェクトのデータ、その後、ちょうどこのクラスの通常の出力演算子を作成するには、(ストリームが実際にテンプレートであることを無視して、再び)このように実装することができますあなたは、出力演算子を実装することができ

struct std::setw { 
    setw(int size): size_(size) {} 
    int size_; 
}; 
std::ostream& operator<< (std::ostream& out, std::setw const& object) { 
    out.width(object.size_); 
    return out; 
} 

あなたはの左側を制御していないのでメンバー:これは、ストリームオブジェクトが座っている場所です。 std::ostreamを実装している場合は、これらのメンバーを実装できます(実際には、特定の出力演算子がstd::ostreamのメンバーであるという標準的な要求があります)。

+0

あの、貴重な情報を投票してくれてありがとう。でも、Xeoがミニ記事を投稿して以来、私はすでに回答を受け入れてきた。再度、感謝します!! – codekiddy

関連する問題