C++ std::remove_if中的谓词出错

C++ std::remove_if中的谓词出错,c++,stl,deque,C++,Stl,Deque,我基本上有一个对象的std::deque,我想根据对象的给定成员变量的条件删除其中一些对象,这样我就可以使用谓词,但我有一些错误,我并不真正理解 我使用g++和-std=c++11是出于STL原因(共享指针),但我试图在带有非c++11代码的MVS的windows上解决这个问题,因此我正在寻找一个非c++11解决方案,而不使用lamdas等 代码是: #include <iostream> // for std::cout and std::endl #include <cst

我基本上有一个对象的
std::deque
,我想根据对象的给定成员变量的条件删除其中一些对象,这样我就可以使用谓词,但我有一些错误,我并不真正理解

我使用
g++
-std=c++11
是出于STL原因(共享指针),但我试图在带有非
c++11
代码的MVS的windows上解决这个问题,因此我正在寻找一个非
c++11
解决方案,而不使用lamdas等

代码是:

#include <iostream> // for std::cout and std::endl
#include <cstdio> // for getchar()
#include <memory> // for std::shared_ptr
#include <deque> // for std::deque
#include <algorithm> // for std::earse and std::remove_if

class A
{
    private:
        int _i;
        double _d;
    public:
        A(int i, double d)
        {
            _i = i;
            _d = d;
        }
        int geti()const
        {
            return _i;
        }
        double getValueOnWhichToCheck()const
        {
            return _d;
        }
};

typedef std::shared_ptr<A> A_shared_ptr;
typedef std::deque<A_shared_ptr> list_type;

void PrintDeque(list_type & dq)
{
    if (0 ==  dq.size())
    {
        std::cout << "Empty deque." << std::endl;
    }
    else
    {
        for (int i = 0 ; i < dq.size() ; ++i)
        {
            std::cout << i+1 << "\t" << dq[i] << std::endl;
        }
    }
}

class B
{
    public:
        double getThreshold() // Non constant for a reason as in real code it isn't
        {
            return 24.987; // comes from a calculation not needed here so I return a constant.
        }
        bool Predicate(A_shared_ptr & a)
        {
            return a->getValueOnWhichToCheck() >= getThreshold();
        }
        void DoStuff()
        {
            A_shared_ptr pT1 = std::make_shared<A>(A(2,      -6.899987));
            A_shared_ptr pT2 = std::make_shared<A>(A(876,    889.878762));
            A_shared_ptr pT3 = std::make_shared<A>(A(-24,    48.98924));
            A_shared_ptr pT4 = std::make_shared<A>(A(78,     -6654.98980));
            A_shared_ptr pT5 = std::make_shared<A>(A(6752,   3.141594209));
            list_type dq = {pT1,pT2,pT3,pT4,pT5};
            PrintDeque(dq);
            bool (B::*PtrToPredicate)(A_shared_ptr &) = &B::Predicate;
            dq.erase(std::remove_if(dq.begin(), dq.end(), PtrToPredicate),dq.end());
            PrintDeque(dq);
        }
};

int main()
{
    B * pB = new B();
    pB->DoStuff();
    getchar();
}

如果,则不能将非静态成员函数指针与
remove\u一起使用<如果
需要普通函数指针、静态成员函数指针或函数对象,则代码>删除。它不能使用成员函数指针的原因是,它需要类的实例才能调用函数,而您不能将其包装到调用中


您需要进行
谓词
静态
,创建函数对象并传递该对象的实例,或者在调用站点中使用lambda

如果,您将无法使用带有
remove\u的非静态成员函数指针<如果
需要普通函数指针、静态成员函数指针或函数对象,则代码>删除。它不能使用成员函数指针的原因是,它需要类的实例才能调用函数,而您不能将其包装到调用中


您需要进行
谓词
静态
,创建函数对象并传递该对象的实例,或者在调用站点中使用lambda

不喜欢函数指针,但使用lambda的this似乎可以编译

无自动更新:

dq.erase(std::remove_if(dq.begin(), dq.end(), std::bind(&B::Predicate, this, std::placeholders::_1)), dq.end());

不喜欢函数指针,但使用lambda的这似乎可以编译

无自动更新:

dq.erase(std::remove_if(dq.begin(), dq.end(), std::bind(&B::Predicate, this, std::placeholders::_1)), dq.end());

我知道,但我不允许(在我工作的解决方案中)使用lambda的…:-(问题更新了好吧,你有一个共享指针的deque,你的谓词引用了一个对象,所以你必须将它更改为引用一个共享对象。如果你不能使用lambda,你能使用基于结构的函子吗?当然可以。试过
bool谓词(a_shared_ptr a)
但我有
不能转换bool(B:*)(A_shared_ptr){aka bool(B:*)(std::shared_ptr)}到'bool(B:*)(A_shared_ptr&){aka bool(B:*)(std::shared_ptr&)}在初始化bool(B:*ptr)中(A_shared_ptr&)=&B::Predicate;
问题……问题在于,正如@NathanOliver指出的,您不能使用带有remove_if的非静态成员函数指针。我更新了我的答案,以包含一个使用std::bind进行排序的变通方法,但lambda在我看来更清晰。我知道,但我不允许(在我正在使用的解决方案中)使用lambda的..:-(问题更新了好吧,你有一个共享指针的deque,你的谓词引用了一个对象,所以你必须将它更改为引用一个共享对象。如果你不能使用lambda,你能使用基于结构的函子吗?当然可以。试过
bool谓词(a_shared_ptr a)
但我有
不能转换bool(B:*)(A_shared_ptr){aka bool(B:*)(std::shared_ptr)}到'bool(B:*)(A_shared_ptr&){aka bool(B:*)(std::shared_ptr&)}在初始化bool(B:*ptr)中(A_shared_ptr&)=&B::Predicate;
问题……问题在于,正如@NathanOliver指出的那样,您不能使用带有remove_if的非静态成员函数指针。我更新了答案,将std::bind的排序方法包括在内,但lambda在我看来更清晰。我能以某种方式使用
bind
吗?(对不起,我不是专家)@user10000100_u u是的,你可以使用bind,但这是C++11的一个功能,如果你打算使用C++11,你应该只使用lambda。我最终使用了
boost::bind
,这是“允许的”。无论如何,谢谢!我可以使用
bind
吗?(对不起,我真的不是专家)@user10000100_u u是的,你可以使用bind,但这是C++11的一个特性,如果你打算使用C++11,你应该只使用lambda。我最后使用了
boost::bind
,这是“允许的”。无论如何,谢谢!
        auto predicateToUse = std::bind(&B::Predicate, this, std::placeholders::_1);
        dq.erase(std::remove_if(dq.begin(), dq.end(), predicateToUse), dq.end());
dq.erase(std::remove_if(dq.begin(), dq.end(), std::bind(&B::Predicate, this, std::placeholders::_1)), dq.end());