简体   繁体   中英

Error while removing from deque

I have an std::deque<CustomType> , I am trying to remove a member whose location I do not know. Therefore, I am first finding it and then removing it.

/* 
  Remove from - members, which is the private variable of std::deque<User> type
*/
void Group::remove_member(User u) {  
    if(this->is_member(u)) {
           std::deque<User>::iterator iter;
           iter = std::find(this->members.begin(), this->members.end(), u);
           if(iter != this->members.end()) {
                this->members.erase(iter);
           }
     }
}

However, the compiler (GCC) is throwing an error which seems like missing Operator Overloading.

In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/algorithm:62,
from Group.cpp:4:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h: In function ‘_RandomAccessIterator std::__find(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIterator = std::_Deque_iterator<User, User&, User*>, _Tp = User]’:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:4224:   instantiated from ‘_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = std::_Deque_iterator<User, User&, User*>, _Tp = User]’
Group.cpp:36:   instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:174: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:178: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:182: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:186: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:194: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:198: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:202: error: no match for ‘operator==’ in ‘__first.std::_Deque_iterator<_Tp, _Ref, _Ptr>::operator* [with _Tp = User, _Ref = User&, _Ptr = User*]() == __val’

See my comment .

I have a feeling you have not declared bool User::operator==(const User&)

The error is telling you that its attempting to do *iterator == ... inside the implementation of std::find . The problem, however, is that you have not overloaded operator== for User . Try declaring a member function inside User as follows...

bool operator==(const User&);

Now, define it to provide some meaningful semantic equality between User s, otherwise std::find doesn't know how to compare them.


As a side note, why doesn't Group::remove_member take const User& rather than User ?

Like @oldrinb mentioned, you need to tell explicitly how to test the equality of two User class. Otherwise the find algorithm won't be able to locate the item you look for. This is done by overriding the == operator.

#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;

class MyCustomClass{
  public:
    MyCustomClass(int id) : id_(id) { }

   // Would produce the same error without this
   bool operator==(const MyCustomClass& b){
     return id_ == b.id_;
   }

   int id(){ return id_; }

  private:
    int id_;
};

int main(void){
  deque<MyCustomClass> q;
  q.push_back(MyCustomClass(1));
  q.push_back(MyCustomClass(2));
  q.push_back(MyCustomClass(3));
  deque<MyCustomClass>::iterator it = 
    find(q.begin(), q.end(), MyCustomClass(2));

  if ( it != q.end() ){
    printf("Found\n");
    q.erase(it);
  }else{
    printf("Not Found!\n");
  }

  for(it = q.begin(); it != q.end() ; it++)
    printf("%d ", it->id());

  printf("\n");

  return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM