所以我试图在C ++的两个类中传递函数作为参数:
void class1::func_1(QString str)
{
class2* r = new class2();
r->func_2(str, &process);
}
void class1::process(QString str)
{
//Do something with str
}
其中'r-> func_2'如下所示:
QString class2::func_2(QString str, void (*callback)(QString))
{
//Do something else
}
然而,当我尝试编译时,我收到以下错误:
must explicitly qualify name of member function when taking its address
r->func_2(str, &process);
^~~~~~~~
class1::
cannot initialize a parameter of type 'void (*)(QString)' with an rvalue of type 'void (class1::*)(QString)'
r->func_2(str, &process);
^~~~~~~~
我无法弄清楚原因。有任何想法吗?我显然做错了什么......只是不确定是什么。任何帮助将不胜感激。谢谢!
答案 0 :(得分:4)
传递地址时,您需要完全限定成员函数名称:
void class1::func_1(QString str)
{
class2* r = new class2();
r->func_2(str, &class1::process);
}
答案 1 :(得分:1)
这些函数是成员函数,它们不是静态的。我建议你使用std :: function和std :: bind。通过这些,您将能够将函数作为参数。请记住,当您使用std :: bind来传递int参数时,它不是静态/全局函数,而是某个对象的成员,您还需要使用这个名为placement的东西。仔细看看。顺便说一句,你不需要使用lambda。
class A
{
std::string m_name;
void DisplayName() { std::cout << m_name };
}
void TakeFunctionAsArgument(std::function<void(void)> func)
{
func();
}
int main()
{
A objectA;
TakeFunctionAsArgument(std::bind(&A::DisplayName, objectA));
return 0;
}