Ошибка при удалении из deque

у меня есть std::deque<CustomType>Я пытаюсь удалить участника, местоположение которого я не знаю. Поэтому я сначала нахожу это и затем удаляю это.

/*
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);
}
}
}

Тем не менее, компилятор (GCC) выдает ошибку, которая выглядит как пропущенная перегрузка оператора.

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’

0

Решение

Увидеть мой комментарий.

У меня такое чувство, что вы не заявили bool User::operator==(const User&)

Ошибка говорит вам, что она пытается сделать *iterator == ... внутри реализации std::find, Проблема, однако, в том, что вы не перегружены operator== за User, Попробуйте объявить функцию-член внутри User следующее…

bool operator==(const User&);

Теперь определите его, чтобы обеспечить некоторое смысловое семантическое равенство между Userс, в противном случае std::find не умеет их сравнивать.


Как примечание стороны, почему не Group::remove_member принимать const User& скорее, чем User?

3

Другие решения

Как упомянуто @oldrinb, вам нужно четко указать, как проверить равенство двух User учебный класс. В противном случае find Алгоритм не сможет найти элемент, который вы ищете. Это делается путем переопределения == оператор.

#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;
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector