4

operator<<クラス内にtypedefがあり、それをで出力できるようにをオーバーロードしたいと思い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.520101112(Red Hat 4.4.5-2)(GCC)

4

2 に答える 2

4

friend関数が定義されinlineていて、クラスの外部に前方宣言がない場合、それは。によってのみ検出されADLます。ただし、オーバーロードは引数ADLを含まないため、によって検出されることはありません(これはのtypedefであることに注意してください)。KK<int>::CSetstd::set<C>

于 2012-10-18T16:21:00.457 に答える
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;
}   
于 2012-10-18T16:43:39.003 に答える