2017-10-29 7 views
1

mingw 5.3.0を使用してコンパイルすると、Win32 API呼び出しの関数ポインタとしてラムダを指定しようとすると、Visual Studio 2013のMSVCを使用すると問題なくコンパイルできます。mingw:ラムダから関数ポインタへの無効な変換

MCVE:

#include <Windows.h> 

int main(int argc, char *argv[]) 
{ 
    bool parameterData; 

    EnumWindows([](HWND windowHandle, LPARAM parameter) -> BOOL { 
     return 1; 
    }, reinterpret_cast<LPARAM>(&parameterData)); 
} 

GCCは、私の周り私の頭をラップすることはできません、次のエラーメッセージ、スロー:

error: invalid user-defined conversion from 'main(int, char**)::<lambda(HWND, LPARAM)>' to 'WNDENUMPROC {aka int (__attribute__((__stdcall__)) *)(HWND__*, long int)}' [-fpermissive] 
    }, reinterpret_cast<LPARAM>(&parameterData)); 
              ^
note: candidate is: main(int, char**)::<lambda(HWND, LPARAM)>::operator BOOL (*)(HWND, LPARAM)() const <near match> 
    EnumWindows([](HWND windowHandle, LPARAM parameter) -> BOOL { 
                 ^
note: no known conversion from 'BOOL (*)(HWND, LPARAM) {aka int (*)(HWND__*, long int)}' to 'WNDENUMPROC {aka int (__attribute__((__stdcall__)) *)(HWND__*, long int)}' 
In file included from C:/Qt/Tools/mingw530_32/i686-w64-mingw32/include/Windows.h:72:0, 
       from main.cpp:1: 
note: initializing argument 1 of 'WINBOOL EnumWindows(WNDENUMPROC, LPARAM)' 
    WINUSERAPI WINBOOL WINAPI EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam); 

をそれはGCCが好きではないことを、正確には何ですか? EnumWindowsの最初のパラメータとしてラムダを使用するためには、何を変更する必要がありますか?

+0

問題はステートレスラムダの変換のようです...あなたはそれをサポートコンパイラのでしょうか? – Rodrigo

答えて

1

EnumWindowsは、stdcall呼び出し規約のコールバックが必要です。 GCCはステートレスラムダをstdcallファンクションポインタに変換することはサポートしていません。ラムダをそのようにマークする方法はありません。ただし、MSVCは、さまざまな呼び出し規約で関数ポインタへの変換を提供します。

残念ながら、あなたが別の関数を使用するか、MSVCを使用する必要があるとしている:

BOOL CALLBACK callback(HWND windowHandle, LPARAM parameter) { ... } 
... 
EnumWindows(callback, reinterpret_cast<LPARAM>(&parameterData)); 
関連する問題