Нет совпадения для оператора == в универсальной функции - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть код ниже, я пытаюсь написать универсальную функцию, которая принимает 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

Я не могу понять, что я получаю эту ошибку.

1 Ответ

5 голосов
/ 26 декабря 2011

У вас есть вектор person *, и вы пытаетесь сравнить их с person.Вам нужно будет изменить строку кода в count_obj так, чтобы она была либо:

if (*(*iter1) == obj)

, либо:

if ((*iter1) == &obj)

в зависимости от того, хотите ли вы сравнить указатели или объекты.

[ Примечание: Вам известна функция std::count в стандартной библиотеке? ]

[ Примечание (2): Какупомянутый в другом ответе, вы, вероятно, должны прочитать о «правильности const».Вы должны объявить ваш operator== как const, а в качестве аргумента должна быть ссылка const. ]

[ Примечание (3): Хранение необработанных указателей в контейнеречасто плохая идея.Например, знаете ли вы, что у вас действительно есть утечка памяти? ]

...