C++ C++;绑定非静态成员函数

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

我试图将一个成员函数传递给嵌套类中的另一个函数

传递非成员函数效果良好,但传递成员不会编译:

A.h: 编译以下
编译器时出现错误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); });