C++ 将类成员指针传递给Lambda捕获列表c++;11

C++ 将类成员指针传递给Lambda捕获列表c++;11,c++,c++11,lambda,C++,C++11,Lambda,我试图将成员指针传递给C++11 lambda,但没有成功 pHub是成员指针 我一直得到以下错误 error C2664: 'void Timer::start(void (__cdecl *)(Timer *),int,int)': cannot convert argument 1 from 'Scheduler::start::<lambda_292d45d0b31426827abd837d93b45bff>' to 'void (__cdecl *)(Timer *)'

我试图将成员指针传递给C++11 lambda,但没有成功

pHub
是成员指针

我一直得到以下错误

error C2664: 'void Timer::start(void (__cdecl *)(Timer *),int,int)': cannot convert argument 1 from 'Scheduler::start::<lambda_292d45d0b31426827abd837d93b45bff>' to 'void (__cdecl *)(Timer *)'

错误不是因为创建lambda;这是从尝试将lambda传递到
Timer::start()
开始的

Timer::start()
需要类型为
void(\uu cdecl*)(Timer*)
的参数,即普通函数指针。因为您试图捕获一些数据(
[此]
),所以lambda表达式正在创建一个函子(可调用对象)

想想看:
Timer::start()
的函数指针参数将传递一个指针(它希望该指针指向适当的函数)。没有地方可以传递任何附加数据(
、函子的地址等)。(这就是为什么C中的回调代码通常有一个回调数据参数和一个函数指针。)


更全面的回答:

只有captureless Lambda可以转换为函数指针。这意味着什么?如果你想得到正确制作的帮助,你应该发布
计时器的定义,至少是相关部分。我不明白为什么有人会对这个答案投赞成票。它包含很多错误。
  pTimer = new Timer(pHub->getLoop());
        pTimer->start([this](Timer *tick) {
            uv_update_time(pHub->getLoop());
            start_time = uv_now(pHub->getLoop());
            printf("Im Tick\n");
        }, 1000, 1000);