2012-05-10 18 views
5

Cuando intento compilar lo siguiente en MinGW 4.6.2EnumChildWindows y lambda

EnumChildWindows(hwnd, [](HWND, LPARAM) -> BOOL { return TRUE; }, 0); 

que recibo

error: cannot convert '<lambda(HWND, LPARAM)>' 
to 'ENUMWINDOWSPROC {aka int (*)(HWND__*,long int)}' 
for argument '2' to 'BOOL EnumChildWindows(HWND, ENUMWINDOWSPROC, LPARAM)' 

¿Estoy declarando la lambda de forma incorrecta, o no es esto simplemente va a funcionar? La definición de Esclerosis Múltiple de la devolución de llamada es

BOOL CALLBACK EnumChildProc(
    __in HWND hwnd, 
    __in LPARAM lParam 
); 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633493%28v=vs.85%29.aspx

es la convención de llamada causando el problema?

+0

http://stackoverflow.com/questions/2935201/will-c0x-support-stdcall-or-extern-c-capture-nothing-lambdas está relacionado. –

Respuesta

6

BOOL RETROLLAMADA EnumChildProc (...)

Ese es el problema, la macro RETROLLAMADA aplica el atributo __stdcall a la función para cambiar la convención de llamada de la configuración predeterminada. Que es __cdecl en la mayoría de los programas. No puede controlar la convención de llamadas para su lambda, salvo cambiar la configuración global (/ opción de compilación Gz). Eso puede tener muchos más efectos secundarios de los que te gustaría, abandona este lamda.

No hay problema en el código de 64 bits por cierto.

+1

@luksy: También tenga en cuenta que VC++ 11 maneja esto para usted implícitamente (es decir, It Just Works). – ildjarn