2017-06-19 55 views
0

我試圖成員指針傳遞給C++ 11拉姆達沒有成功傳類成員指針LAMBDA捕獲列表C++ 11

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); 
+2

只有captureless lambda表達式可被轉換爲函數指針。 – Praetorian

+0

這是什麼意思 – user63898

+1

如果你想獲得正確的幫助,你應該發佈'Timer'的定義,至少是相關的部分。 – skypjack

回答

1

錯誤不是從創建lambda;它試圖將lambda傳遞給Timer::start()

Timer::start()正在等待一個類型爲void (__cdecl *)(Timer *)的參數 - 也就是一個普通的函數指針。因爲你試圖捕獲一些數據([this]),所以你的lambda表達式正在創建一個函子(一個可調用的對象)。

想想看:Timer::start()的函數指針參數是要獲得通過一個指針(它希望指向一個合適的函數)。沒有任何附加數據(this,仿函數的地址等)被傳遞。 (這就是爲什麼用C回調代碼通常具有一個函數指針沿回調數據參數。)

更全面的答案:Passing lambda as function pointer

+0

我不明白某人可以如何高舉這個答案。它包含很多錯誤。 – skypjack