2012-10-18 66 views
4

我在類中有一個typedef,我想重載operator<<,因爲它能夠在ostream中打印它。但是,編譯器無法找到重載的操作符。我該如何聲明它才能起作用?重載<<對於另一個類中的類型

#include <iostream> 
#include <set> 

using namespace std; 

template <class C> 
struct K { 

    typedef std::set<C> Cset; 

    Cset s; 
    // and many more elements here 

    friend ostream& operator<<(ostream& oo, const Cset& ss){ 
     typename Cset::const_iterator it=ss.begin(); 
     oo << "["; 
     for(; it!=ss.end(); ++it) oo << (*it) << ","; 
     oo << "]"; 
     return oo; 
    } 

    void DoSomething(){ 
     // do something complicated here 
     cout << s << endl; 
     // do something complicated here 
    } 

}; 


int main(){ 
    K <int> k; 
    k.s.insert(5); 
    k.s.insert(3); 
    k.DoSomething(); 

} 

gcc版本4.4.5 20101112(紅帽4.4.5-2)(GCC)

+1

就是爲什麼你想要它定義在類內部,這樣的功能仍看不見外面'結構K'的原因是什麼? – dasblinkenlight

+0

@dasblinkenlight並定義它outid一個好主意?我的意思是,它可以與其他人的一個熟悉的定義碰撞(例如在不同的頭文件中?)無論如何,這似乎工作,非常感謝! –

+0

他的代碼在VC 2010和G ++ 3.3.3上編譯並運行良好3.3.3 – user93353

回答

4

friend函數被定義inline並且在類之外沒有向前聲明,它只能通過ADL找到。然而,ADL永遠不會發現您的超載,因爲它不涉及K自變量(請注意,K<int>::CSettypedef代表std::set<C>)。

+1

參數是K :: CSet。所以它確實涉及到K.無論如何,這些代碼在VC 2010和G ++ 3.3.3上編譯並運行。這不是證明它是好代碼,但.. – user93353

+1

@ user93353:'K :: CSet'是'std :: set '的_typedef_,'C'是'int',而不是'K'。 –

0

只是爲了完整性:代碼的最終版本operator<<

template <class T, class U> 
std::ostream& operator<<(std::ostream& oo, const std::set <T,U> & ss){ 
    typename std::set <T,U> ::const_iterator it=ss.begin(); 
    oo << "["; 
    if(it!=ss.end()) oo << (*it++); 
    while(it!=ss.end()) oo << "," << (*it++); 
    oo << "]"; 
    return oo; 
} 
相關問題