2016-03-23 3 views
0

Я пытаюсь удалить объект из вектора в C++, но он задает странную (и длинную) ошибку. Я написали это:Удалить объект из вектора в C++

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

class foo 
{ 
    int a; 
    public: 
    foo(int _a):a(_a){} 
}; 

int main() { 
    foo f1(5),f2(10); 
    vector<foo> vec = {f1,f2}; 
    vec.erase(remove(vec.begin(),vec.end(),f1),vec.end()); // remove f1 (error) 
    return 0; 
} 

Точная ошибка, которую я получаю, это here.
С другой стороны, когда я создаю вектор int, а затем пытаюсь удалить целое число из этого вектора, он отлично работает.

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

int main() { 
    vector<int> vec = {5,10}; 
    vec.erase(remove(vec.begin(),vec.end(),5),vec.end()); // works fine 
    return 0; 
} 

Я не уверен, почему в первом случае возникает ошибка.

+2

Сообщения точным сообщения об ошибке –

+3

Там нет 'Foo :: оператора ==' –

+1

Я думаю, вы получите сообщение об ошибке, потому что у вас нет оператора сравнения, определенного для ' foo'. Как компилятор знает, как сравнивать экземпляры класса 'foo'? –

ответ

5

Для std::remove ваш class foo должен содержать operator == или вы должны явно передать функцию сравнения. Для стандартных типов (например, int) функция сравнения определяется языком и, таким образом, компилируется без ошибок.

Одним из примеров operator == могут быть:

class foo 
{ 
    ... 
    bool operator ==(const foo &t) const { return t.a == a; } 
}; 
Смежные вопросы