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
私はこのエラーが発生していることを理解できないようです。
本当にありがとうございました。しかし、私の関数によって返されたカウントは、2になるべきであるときには常に1です。何が問題になりますか? – cody
@cody:投稿した最初の亜種を使用している場合、それはあなたが望んでいたことを行うはずです。 –
ありがとうございました。私はベクトルを使用したかった myp;それが当てはまる場合は、オブジェクトのpush_back参照を使用してコピーを防止します。ですから、私の質問は、push_back(&a)またはpush_back(a)を推奨するものです。それは参照により効率化されますか? –
cody