2012-01-06 57 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:\用戶\ ADMIN \文檔\ Visual工作室 2010 \項目\ cppsystem \ eventhandling \ test.h 18個

非常感謝。

回答

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; 
} 

現在你不需要超載在Eventoperator<<了。

+0

ahahah:D我現在明白了,非常感謝Xeo,你剛剛救了我的鍵盤!你的代碼就像一個魅力。 – codekiddy 2012-01-06 22:48:59

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的回答,因爲他在minit中發佈。再次感謝!! – codekiddy 2012-01-06 22:52:59