您好我尝试在vc ++中构建一个tamplate函数,如下所示:
template<class _Fn0,class _Fn1> void for_each(_Fn0 _Func0,_Fn1 _Func1)
{
_Func0(12);
_Func1(12);
}
当我使用_Func0 / 1这个全局函数时,这项工作正在顺利进行。
void aglobal(int a)
{
a++;
}
for_each(aglobal,aglobal);
但是当我使用memeber类函数时,我收到错误消息。
class A
{
public:
void aa(int a)
{
a++;
}
void bb(int b)
{
b++;
}
void cc()
{
for_each(&A::aa,&A::bb);
}
};
错误C2064:术语不评估为采用1个参数的函数 1 GT;请参阅正在编译的函数模板实例化'void for_each(_Fn0,_Fn1)'的引用。
我如何解决此错误?
谢谢herzl。
答案 0 :(得分:9)
A::aa
和A::bb
是非静态成员函数;你试图将它们称为非成员函数。
只能在对象的实例上调用非静态成员函数。
要修复它,你可以
将aa
和bb
设为静态,或
将A
的实例传递给for_each
,以便它可以调用该实例上的函数,或者
使用std::bind
/ std::tr1::bind
/ boost::bind
将成员函数绑定到实例,然后再将其传递给函数模板,或者
编写一个函子,它存储一个指向要调用成员函数的A
实例的指针,以及一个指向要调用的成员函数的指针;这实际上是bind
的作用(虽然bind
更通用)。
答案 1 :(得分:1)
类的成员函数总是接受额外的参数“this”指针,所以你可以让它们静态来试试这个。