2011-01-09 120 views
5

我有以下代碼:重載運算符<<上ofstream的串聯問題

struct simple 
{ 
    simple (int a1, int a2) : member1(a1), member2(a2) {} 
    int member1; 
    int member2; 
}; 

std::ofstream &operator << (std::ofstream &f, const simple &obj) 
{ 
    f<<obj.member1<<", "<<obj.member2; 
    return f; 
} 
int main(int argc, const char *argv[]) 
{ 
    std::ofstream f("streamout.txt"); 

    simple s(7,5); 
    f << s;    //#1 This works 
    f << "label: " << s; //#2 This fails 

    return 0; 
} 

我試圖理解爲什麼#1的作品,同時嘗試使用重載的運算符相連來在的時候有問題#2失敗,出現以下錯誤(GCC 4.5.3 MacOSX上):

error: cannot bind 'std::basic_ostream' lvalue to 'std::basic_ostream&&' /GCC-FACTORY/4.5/INSTALL/lib/gcc/x86_64-apple-darwin10.5.0/4.5.3/../../../../include/c++/4.5.3/ostream:579:5: error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits, _Tp = simple]'

一切是不是很好,如果我定義我的操作員

std::ostream &operator << (std::ostream &f, const simple &obj) 
{ ... } 

聽起來像某些與重載分辨率有關的東西,其中有一些東西插入到已經有提供的重載(在這種情況下是const char *「label」)在重載解析之後分解的流中,但是我不能瞭解這裏究竟發生了什麼。 我想獲得什麼樣的編譯器的嘗試做..

+1

我不知道爲什麼編譯器會抱怨,但爲`ostream`(即公共基類)重載是正確的事情,因爲它允許它用於各種輸出流。 – 2011-01-09 18:47:07

回答

16

就行了清晰的畫面:

f << "label: " << s; 

因爲要operator<<第一次調用返回std::ostream &,第二編譯失敗:操作符的左操作數不再是std::ofstream類型,並且未找到超載。

你應該真的使用第二個簽名,因爲我沒有理由限制你的類型輸出到std::ofstream

+0

但是,`f << s <<「標籤:」`應該可以工作! – Nawaz 2011-01-09 19:27:48