find_if函数构建问题

时间:2009-05-27 00:14:58

标签: c++ stl

我正在尝试在1文件.cpp文件中构建以下代码块:

#include <iostream>

#include <algorithm>
using namespace std;

class test
{

public:

    int a[10];
    int index;

    test();
    ~test();
    bool equals(int p);
    void search();
};

test::test()
{
    int temp[10] = {4, 9, 5, 6, 9, 10, 9, 255, 60, 0};

    memcpy(a, temp, sizeof(temp));

    index = -1;
}

bool test::equals(int p)
{
    return p == 9;
}

void test::search()
{
    int* p = std::find_if(a, a+10, &test::equals);
    while (p != a+10)
    {
        cout<< *p;
        index = p - a;
        p = std::find_if(p+1, a+10, &test::equals);
    }
}

int main(int argc, char *argv[])
{
    test object;

    object.search();

    return 0;
}

我收到如下所示的错误,当我在类的成员方法中使用find_if函数时,我不确定发生了什么,而且每当我这样做时我都会收到此错误。

1>c:\program files\microsoft visual studio 8\vc\include\algorithm(87) : error C2064: term does not evaluate to a function taking 1 arguments
1>        c:\program files\microsoft visual studio 8\vc\include\algorithm(96) : see reference to function template instantiation '_InIt std::_Find_if(_InIt,_InIt,_Pr)' being compiled
1>        with
1>        [
1>            _InIt=int *,
1>            _Pr=bool (__thiscall test::* )(int)
1>        ]
1>        c:\testprogram\nomfc\main.cpp(32) : see reference to function template instantiation '_InIt std::find_if(_InIt,_InIt,_Pr)' being compiled
1>        with
1>        [
1>            _InIt=int *,
1>            _Pr=bool (__thiscall test::* )(int)
1>        ]

4 个答案:

答案 0 :(得分:1)

test::equals是一个成员函数,它具有与普通函数指针不同的指针语法。特别是,要调用它,find_if将需要一个test类型的对象,它没有它(例如,它不会在this上自动调用它,我猜是你的想法。

您可以将功能equals移到课程test之外,它应该有效。

答案 1 :(得分:1)

find_if函数需要一个可以作为没有参数的函数调用的对象。这类似于自由函数,函数对象或静态类函数。你传递了equals成员函数的地址,这些函数都不是。您可以通过使equals函数成为自由函数或静态函数来解决此问题,因为它不需要test实例的任何成员。

// static
class test
{
  public:
    static bool equals(int p); // etc
};
int* p = std::find_if(a, a+10, &test::equals);

// free
bool equals(int p)
{
    return p == 9;
}
int* p = std::find_if(a, a+10, equals);

如果您的真实代码示例要求它是成员函数,那么您需要传入一个函数对象,该函数对象充当类实例的闭包。我赞成使用Boost绑定方法,但也有其他方法。

int* p = std::find_if(a, a+10, boost::bind(&test::equals, this, _1));

答案 2 :(得分:1)

int *p = find_if(a, a+10, bind1st(mem_fun(&test::equals), this));

或者更好的是,摆脱那个test::equals()成员函数然后

int *p = find_if(a, a+10, bind2nd(equals(), 9));

其中equals实际上是std::equals(),是标题<functional>中定义的二元函子。

答案 3 :(得分:0)

find_if的第三个参数必须是(指向一个)函数或函数的一个参数,而不是一个(指向一个)实例方法,这是你正在使用的。例如,一个合适的函子可能(从[此主题] [1]松散地改编):

template <typename PType, typename ArgType>
class is_good_test : unary_function<PType, bool>
{ public:
is_good_test(const ArgType & arg) : _val(arg) { }
~is_good_test() { }

bool operator()(const PType p) const
{
return p->equals(_val);
}

private:
ArgType _val;
};

可让您拨打电话:

std::find_if(a, a+10, is_good_test<test*, int>(10))


  [1]: http://www.velocityreviews.com/forums/t288980-functors-and-stl-findif.html