C++ C++;绑定非静态成员函数
我试图将一个成员函数传递给嵌套类中的另一个函数 传递非成员函数效果良好,但传递成员不会编译: A.h: 编译以下C++ C++;绑定非静态成员函数,c++,c++11,C++,C++11,我试图将一个成员函数传递给嵌套类中的另一个函数 传递非成员函数效果良好,但传递成员不会编译: A.h: 编译以下编译器时出现错误1: 实际上,将A::member定义为static解决了这个问题,但是我无法再访问myMap。 如何绑定非静态成员函数 我还试图直接传递被调用的函数,导致编译器错误2: 您需要将this指针传递到bind(或lambda)。如果没有实例,则不能使用实例变量/函数 myC->execute(bind(&A::member, this, 42)); myC
编译器时出现错误1
:
实际上,将A::member
定义为static
解决了这个问题,但是我无法再访问myMap
。
如何绑定非静态成员函数
我还试图直接传递被调用的函数,导致
编译器错误2
:
您需要将
this
指针传递到bind
(或lambda)。如果没有实例,则不能使用实例变量/函数
myC->execute(bind(&A::member, this, 42));
myC->execute([this]{ member(42); });
是否执行(函数func;
缺少一个)
?拼写我想…一个旁注:bind
很糟糕,尽量避免使用lambdas。这里绝对有可能。@VioletGiraffe是不是太夸张了?请不要发布虚构的代码,发布真实的代码。我在改进其他人的编辑时添加了两个缺少的分号。但有一个我直到后来才看到,也许还有更多的错误。当代码中充满了不相关的错误时,我们怎么能相信这就是您遇到问题的代码呢?请只发布真实的代码。@VioletGiraffe我同意没有理由在lambdas上使用它,我过去认为没有类型擦除的普通类型可能很有用,例如用于处理程序映射,但后来我了解到返回类型很神奇,我不知道。这是一个非常好的答案,谢谢!对于进一步的读者来说:如果42
是一个变量(比如i
),lambda项将是myC->execute([this,i]{member(i);})代码>
void A::member(int param)
{
A::myMap[param].doSomething();
}
void nonA_func(int param)
{
...
}
void A::caller()
{
myC->execute(bind(nonA_func, 42)); // OK
myC->execute(bind(A::member, 42)); // COMPILER ERROR 1
myC->execute(A::myMap[42].doSomething()); // COMPILER ERROR 2
}
A::main()
{
myC = new A::C();
// filling myMap
caller();
myMap.clear();
delete C;
}
error: invalid use of non-static member function
myC->execute(bind(A::member, 42));
^
invalid use of void expression
myC->execute(A::myMap[42].doSomething());
^
myC->execute(bind(&A::member, this, 42));
myC->execute([this]{ member(42); });