C++ 对非指针类型的向量使用std::remove_if

C++ 对非指针类型的向量使用std::remove_if,c++,vector,stl,C++,Vector,Stl,我有一个物体向量: std::vector<QueuedMessage> _messages; 我的比较功能: bool MessageQueue::wasMessageSend(const QueuedMessage& mess){ return mess.canSendMessage(); } 并比较对象类中的函数: bool QueuedMessage::canSendMessage() const{ return

我有一个物体向量:

std::vector<QueuedMessage> _messages;
我的比较功能:

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) (...)'|
我没有使用指针向量是个问题吗?还是我遗漏了什么?谢谢。

传递给的谓词应该是具有bool predconst Type&a;等签名的一元谓词;。这意味着它将以元素作为参数调用。但是wasMessageSend是一个成员函数,因此,除了参数之外,它还需要一个实例来调用。因此,如果直接使用,则不能与remove_一起使用

从C++11开始,您可以使用它,如:

_messages.erase(std::remove_if(
    _messages.begin(),
    _messages.end(),
    [this](const QueuedMessage& q) {
        return wasMessageSend(q);
    }
));
传递给的谓词应该是具有bool predconst Type&a;等签名的一元谓词;。这意味着它将以元素作为参数调用。但是wasMessageSend是一个成员函数,因此,除了参数之外,它还需要一个实例来调用。因此,如果直接使用,则不能与remove_一起使用

从C++11开始,您可以使用它,如:

_messages.erase(std::remove_if(
    _messages.begin(),
    _messages.end(),
    [this](const QueuedMessage& q) {
        return wasMessageSend(q);
    }
));
由于wasMessageSend是MessageQueue类的成员函数,因此在本例中,您需要将其绑定到一个对象,使用std::bind

当然,这不是唯一的方法,例如,您可以当场定义lambda谓词。。。但是这个方法展示了如何使用成员函数作为谓词。

因为wasMessageSend是类MessageQueue的成员函数,所以在这种情况下,您需要使用std::bind将它绑定到一个对象



当然,这不是唯一的方法,例如,您可以当场定义lambda谓词。。。但是这个方法展示了如何使用成员函数作为谓词。

wasMessageSend不是一个函数。如果调用是指向成员函数的指针,则它是remove_中的一个成员函数。或者,您可以将wasMessageSend设置为static。wasMessageSend不是一个函数。这是一个成员函数。如果调用是指向成员函数的指针,则remove_中的wasMessageSend。或者,您可以将wasMessageSend设置为静态。您可以参考song的answer@BoundaryImposition我知道答案也是有效的,但我很想知道为什么你认为它更好或说更少过时。在我看来,这个语法有点简单,看起来不那么简单。lambda表达式非常有表现力,这就是为什么它被添加到language@A.S.H您可能想阅读或阅读书籍第34项:更喜欢lambdas而不是std::bind以了解更多信息。我尊重您的意见,但我始终更喜欢在谓词准备就绪时进行绑定,但唯一的障碍是作为成员函数。谢谢。你可以参考宋的answer@BoundaryImposition我知道答案也是有效的,但我很想知道为什么你认为它更好或说更少过时。在我看来,这个语法有点简单,看起来不那么简单。lambda表达式非常有表现力,这就是为什么它被添加到language@A.S.H您可能想阅读或阅读书籍第34项:更喜欢lambdas而不是std::bind以了解更多信息。我尊重您的意见,但我始终更喜欢在谓词准备就绪时进行绑定,但唯一的障碍是作为成员函数。谢谢,谢谢!它起作用了!我想我完全忘记了使用成员函数作为比较器可能会导致此问题,因为我认为它与存储对象的成员函数有关,而不是与存储向量的类有关。@BoundaryPosition感谢您的编辑!但是为什么缩进要有3个空格?@songyuanyao:为什么不?@BoundaryPosition因为我刚刚习惯了2或4个。是的,我知道这是个人意见的问题。这就是为什么制表符缩进要优越得多的原因,这样你就可以以你选择的方式呈现代码,而不会把你的选择强加给其他人,就像你可以选择字体和颜色一样。此外,代码的缩进获得了严格而明确的语义—一个tabspace=一个缩进级别,可以自动解释,然后以任何您喜欢的方式进行处理。遗憾的是,这在网络上效果很差,所以你只能使用我的三个空间谢谢它起作用了!我想我完全忘记了使用成员函数作为比较器可能会导致此问题,因为我认为它与存储对象的成员函数有关,而不是与存储向量的类有关。@BoundaryPosition感谢您的编辑!但是为什么缩进要有3个空格?@songyuanyao:为什么不?@BoundaryPosition因为我刚刚习惯了2或4个。是的,我知道这是个人意见的问题。这就是为什么制表符缩进要优越得多的原因,这样你就可以以你选择的方式呈现代码,而不会把你的选择强加给其他人,就像你可以选择字体和颜色一样。此外,代码的缩进获得了严格而明确的语义—一个tabspace=一个缩进级别,可以自动解释,然后以任何您喜欢的方式进行处理。遗憾的是,这在网络上效果很差,所以你只能使用我的三个空间
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());
}