我尝试将成员指针传递给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 *)'
我希望能够在函数
中使用pHub
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);
答案 0 :(得分:1)
错误不是来自创建lambda;这是试图将lambda传递给Timer::start()
。
Timer::start()
期望类型void (__cdecl *)(Timer *)
的参数 - 即普通函数指针。因为您正在尝试捕获一些数据([this]
),所以您的lambda表达式正在创建一个仿函数(一个可调用对象)。
考虑一下:Timer::start()
的函数指针参数将被传递一个指针(它希望指向一个合适的函数)。没有任何地方可以传递任何其他数据(this
,仿函数的地址等)。 (这就是为什么C中的回调代码通常有一个回调数据参数以及一个函数指针。)