我正在尝试在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> ]
答案 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