我有一个对象矢量:
std::vector<QueuedMessage> _messages;
尝试使用erase-remove idiom删除所有对象:
void MessageQueue::removeFromQueue(){
_messages.erase(std::remove_if(_messages.begin(),_messages.end(),wasMessageSend),_messages.end());
}
我的比较功能:
bool MessageQueue::wasMessageSend(const QueuedMessage& mess){
return mess.canSendMessage();
}
比较对象类中的函数:
bool QueuedMessage::canSendMessage() const{
return (SDL_GetTicks() >= startTick);
}
但是,我收到此错误:
error: must use '.*' or '->*' to call pointer-to-member function in '((__gnu_cxx::__ops::_Iter_pred<bool (MessageQueue::*)(const QueuedMessage&)>*)this)->__gnu_cxx::__ops::_Iter_pred<bool (MessageQueue::*)(const QueuedMessage&)>::_M_pred (...)', e.g. '(... ->* ((__gnu_cxx::__ops::_Iter_pred<bool (MessageQueue::*)(const QueuedMessage&)>*)this)->__gnu_cxx::__ops::_Iter_pred<bool (MessageQueue::*)(const QueuedMessage&)>::_M_pred) (...)'|
我没有使用指针向量是一个问题吗?或者我错过了什么?感谢。
答案 0 :(得分:3)
传递给std::remove_if的谓词应该是一个带有bool pred(const Type &a);
签名的一元谓词。这意味着它将以元素作为参数调用。但是wasMessageSend
是一个成员函数,所以除了参数之外,还需要调用一个实例。因此它不能直接与remove_if
一起使用。
你可以使用lambda(因为C ++ 11),如:
_messages.erase(std::remove_if(
_messages.begin(),
_messages.end(),
[this](const QueuedMessage& q) {
return wasMessageSend(q);
}
));
答案 1 :(得分:1)
由于wasMessageSend
是您的班级MessageQueue
的成员函数,因此您需要使用this
<将其“绑定”到对象(在本例中为std::bind
) / p>
void MessageQueue::removeFromQueue(){
_messages.erase(std::remove_if(_messages.begin(),_messages.end(),
std::bind(&MessageQueue::wasMessageSend, this, std::placeholders::_1), // bind this
std::_messages.end());
}
当然,这不是唯一的方法,例如你可以在现场定义一个lambda谓词......但是这个方法展示了如何使用成员函数作为谓词。