2012-04-16 10 views
0

コンパイル時に次のようなコードが表示されます。この問題は、オーバーロードされた挿入演算子(つまり、演算子< <())内にconst_iteratorを作成した時点で発生しています。 setのテンプレート引数バージョンは正しくないと思います。誰もがピッチをしてこのコードを動作させることができますか?STLのstd :: setコンテナパラメータがオーバーロードされた演算子<<()

#include <iostream> 
#include <set> 

using namespace std; 

class A { 
public: 
    int _i; 
    A(int i) : _i(i) {} 
    bool operator < (A a) const { return _i < a._i; } 
}; 

class compA { 
public: 
    bool operator()(A a1, A a2) const { return (a1._i > a2._i); } 
}; 

template<class T, class C> 
std::ostream& operator << (std::ostream& os, const set<T, C>& s) { 
    std::set<T, C>::const_iterator itr = s.begin(); 

    for (int i = 0; i < s.size(); i++) { 
     os << *itr++ << " "; 
    } 

    return os; 
} 

int main() { 
    set<A, less<A> > s1; 
    set<A, compA> s2; 

    s1.insert(A(9)); s1.insert(A(3)); s1.insert(A(-5)); s1.insert(A(3)); 
    s2.insert(A(2)); s2.insert(A(1)); s2.insert(A(7)); 

    cout << s1; 
    cout << s2; 
} 
+0

[GCC-4.7コンパイルエラー]の重複可能性があります(http://stackoverflow.com/questions/10155571/gcc-4-7-compilation-error) – Nawaz

+0

重複する可能性のあるトピックを参照してください。 '<'の2つのオブジェクトを比較するために '<'を使います。彼が持っている@Nawaz – Nawaz

+0

。私は彼が 'operator <<(A)'を宣言するのを忘れたと思う。 –

答えて

1

あなたはまた、あなたの比較クラスのメソッドのシグネチャがあるべき

std::ostream& operator << (std::ostream& os, const A& s) 
{ 
    return os; 
} 

を宣言し、実装するのを忘れ:

bool operator()(const A& a1, const A& a2) 
+0

でエラーをスローする以外は問題なくコンパイルされます。あるいは、A :: operator int'のような(おそらく通常は劣っている)代替として、Aが暗黙的に何かに変換できるようになりますwhich 'operator <<'はすでに定義されています。 –

+0

私は既にこれをテンプレート関数を使って実装しました。 –

+0

@IbrahimQuraish投稿したコードには表示されません。 –

0

*itrタイプconst A&となりますので、あなたos<<*itr++コンパイラはどのようにオブジェクトAを印刷するか分からない、あなたはoperator <<を提供する必要がありますAもあります。

+0

したがって、クラスA内の関数を ostream&operator <<(ostream&os){ os << this._i; } は、これとオーバーロードされたテンプレート関数との間に曖昧さはありませんか? –

関連する問題