通用函数中的运算符==不匹配

cod*_*ody 0 c++ operator-overloading template-function

我有下面的代码,我正在尝试编写一个泛型函数,它接受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);

}
Run Code Online (Sandbox Code Playgroud)

以下是通用功能

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;
}
Run Code Online (Sandbox Code Playgroud)

我的主要:

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'; 

}
Run Code Online (Sandbox Code Playgroud)

完全错误

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
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚我得到了这个错误.

Oli*_*rth 5

你有一个矢量person *,你试图将它们与a进行比较person.您需要将代码行修改count_obj为:

if (*(*iter1) == obj)
Run Code Online (Sandbox Code Playgroud)

要么:

if ((*iter1) == &obj)
Run Code Online (Sandbox Code Playgroud)

取决于您是否希望比较指针或对象.

[ 注意:您是否了解std::count标准库中的功能?]

[ 注释(2):正如另一个答案中所提到的,你应该阅读"const correctness".你应该声明你的operator==as const,它应该const作为参数引用.]

[ 注意(3):在容器中存储原始指针通常是个坏主意.例如,您是否意识到您实际上有内存泄漏?]