2011-12-26 9 views
0

私は以下のコードを持っています.2つのイテレータとオブジェクトを取り、出現回数をチェックして出現回数を返す汎用関数を記述しようとしています。以下は汎用関数内の演算子==には一致しません

class person{ 

string name; 
int age; 

public: 
person(string n, int a): name(n), age(a) {} 
bool operator==(person &p); 

}; 

bool person::operator==(person &p){ 

return (name == p.name && age == p.age); 

} 

私の単純なクラス以下

template<typename Iter, typename Obj> 
int count_obj(Iter iter1, Iter iter2, Obj &obj){ 
int count = 0; 
for (; iter1 != iter2; iter1++){ 
    if((*iter1) == obj) 
    count += 1; 

} 

return count; 
} 

私の主な一般的な機能である:

int main(){ 
vector<person *> myp; 

person a("ted", 21); person b("sun", 100); person c("ted", 21); 
myp.push_back(&a);myp.push_back(&b);myp.push_back(&c); 

cout<< "occurences for person objects " << count_obj(myp.begin(), myp.end(), a) << '\n'; 

} 

全エラー

3b.cc: In function ‘int count_obj(Iter, Iter, Obj&) [with Iter = __gnu_cxx::__normal_iterator<person**, std::vector<person*> >, Obj = person]’: 
3b.cc:61:79: instantiated from here 
3b.cc:42:3: error: no match for ‘operator==’ in ‘iter1.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = person**, _Container = std::vector<person*>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = person*&]() == obj’ 
make: *** [3b] Error 1 

私はこのエラーが発生していることを理解できないようです。

答えて

5

person *のベクトルがあり、それらをpersonと比較しようとしています。あなたはどちらかであることをcount_obj内のコードの行を変更する必要があります:

if (*(*iter1) == obj) 

か:

if ((*iter1) == &obj) 

あなたはポインタやオブジェクトを比較したいかによって異なります。

[注:標準ライブラリのstd::count機能は認識していますか?]

[注(2):別の回答に記載されているとおり、おそらく "const correctness"を読むべきです。 operator==constと宣言し、constという参照を引数に取る必要があります。]

[注(3):生ポインタをコンテナに格納することは、しばしば悪い考えです。たとえば、効果的にメモリリークがあることを認識していますか?]

+0

本当にありがとうございました。しかし、私の関数によって返されたカウントは、2になるべきであるときには常に1です。何が問題になりますか? – cody

+0

@cody:投稿した最初の亜種を使用している場合、それはあなたが望んでいたことを行うはずです。 –

+0

ありがとうございました。私はベクトルを使用したかった myp;それが当てはまる場合は、オブジェクトのpush_back参照を使用してコピーを防止します。ですから、私の質問は、push_back(&a)またはpush_back(a)を推奨するものです。それは参照により効率化されますか? – cody

関連する問題