2014-04-28 6 views
-2

Я пробовал что-то похожее на this, но это не работает для меня. Вот код:Удаление объекта из вектора

void Player::remove_card_from_hand(Card* the_card){ 
    current_cards.erase(remove(current_cards.begin(), current_cards.end(), the_card), current_cards.end()); //Error occurs here at third argument "the_card" 
} 

где vector<Card*>current_cards; определяет вектор указателей на объекты карты.

Однако я получаю ошибку:

C2660: 'remove' : function does not take 3 arguments

я понимаю, что с the_card как указатель на объект, то, что, вероятно, называя его. Может кто-нибудь сказать мне, что не так с этим кодом, или показать мне другой способ попытаться удалить объект из вектора объектов.

Редактировать

Простая проблема, не хватает #include <algorithm>. В настоящее время работает.

+0

Вы, кажется, используете 'namespace std;', что редко является хорошей идеей. Возможно, существует еще одна функция 'remove()' scope? Получаете ли вы ту же ошибку, если вы явно квалифицируете 'std :: remove()'? – Angew

+0

Да, я использую namespace std; '. 'std :: remove()' не имеет никакого отношения к той же самой ошибке. По функции в области, вы имеете в виду, что я использовал 'remove()' в другом месте? –

+0

Это сообщение об ошибке * только *? Нет дополнительного текста, указывающего на тот, который компилятор * думает *, о котором вы говорите? – WhozCraig

ответ

1

Сообщение об ошибке достаточно ясно. Вы вызываете функцию, у которой нет трех аргументов. Кажется, что вы определили в глобальном пространстве имен функцию с именем remove и вызвали ее.

Включить заголовок <algorithm> и использовать квалифицированное имя для алгоритма std::remove

current_cards.erase(std::remove(current_cards.begin(), current_cards.end(), the_card), 
        current_cards.end()); 

Кроме того, я не уверен, что вы делаете задание правильно. Возможно, вы имели в виду следующее:

current_cards.erase(std::remove_if(current_cards.begin(), current_cards.end(), 
        [&](const Card * & c) { return *c == *the_card); }), 
        current_cards.end()); 
+0

Вы были правы: 'current_cards.erase (std :: remove (current_cards.begin(), current_cards.end(), the_card), current_cards.end());' не работает должным образом. Поэтому я теперь пытаюсь использовать ваше предложение, но я получаю эту ошибку: 'error C2678: binary '==': оператор не найден, который берет левый операнд типа 'const Card' (или нет приемлемого преобразования) '. Какие-нибудь догадки о том, что может произойти? –

+0

@RedShift Вам необходимо перегрузить operator == для вашего класса в этом случае. В противном случае неясно, что вы подразумеваете под поиском объекта класса. Каков критерий, что объект находится в контейнере? –

+0

Извините, что вы подразумеваете под этим «Каков критерий, что объект находится в контейнере?». Как я понимаю, я начинающий программист на C++. –

Смежные вопросы