ページ 11

[C++]glfwSetKeyCallback()にラムダ式を渡そうとしたのですがコンパイルできません

Posted: 2015年5月24日(日) 02:43
by NyanCo
はじめまして、C++初心者です。
ラムダ式がコールバックに有用とのことでコードをスッキリさせようと思い
glfwSetKeyCallback()にラムダ式を渡したのですがコンパイラに型が違う(?)と怒られてしまいました。
(GLFWkeyfun)でキャストしてみたり戻り値に -> GLFWkeyfun や -> voidと書いても状況は変わらず八方ふさがりで困っています。

コードは以下の通りです。

コード:

int myWindowInit(GLFWwindow** mainWindow, /*略*/base_c * base)
{
    /*中略*/
    glfwSetKeyCallback(*mainWindow, [=] (GLFWwindow* cbWindow, int key, int scancode, int action, int mod) {if(action == GLFW_PRESS && base != NULL)base->func(key);});
    return 0;
}
コンパイル時のコマンドラインと結果は以下の通りです。

$ g++ -std=c++11 `pkg-config --cflags glfw3` -o myprog3 copymain.c title_c.cpp myGLFunctions.c `pkg-config --libs glfw3` -lGLEW

copymain.c: In function ‘int myWindowInit(GLFWwindow**, GLFWmonitor**, config_t*, base_c*)’:
copymain.c:306:166: error: cannot convert ‘myWindowInit(GLFWwindow**, GLFWmonitor**, config_t*, base_c*)::__lambda0’ to ‘GLFWkeyfun {aka void (*)(GLFWwindow*, int, int, int, int)}’ for argument ‘2’ to ‘void (* glfwSetKeyCallback(GLFWwindow*, GLFWkeyfun))(GLFWwindow*, int, int, int, int)’
glfwSetKeyCallback(*mainWindow, [=] (GLFWwindow* cbWindow, int key, int scancode, int action, int mod) {if(action == GLFW_PRESS && base != NULL)base->func(key);});
^
ライブラリとコンパイラのバージョンは以下の通りです。

glfw 3.1.1
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2

初投稿で至らぬ点が多々あるとは思いますがどうかお力添えの程をおねがいします。

Re: [C++]glfwSetKeyCallback()にラムダ式を渡そうとしたのですがコンパイルできません

Posted: 2015年5月24日(日) 02:53
by h2so5
キャプチャ付きのラムダを関数ポインタにキャストすることはできません。

Re: [C++]glfwSetKeyCallback()にラムダ式を渡そうとしたのですがコンパイルできません

Posted: 2015年5月24日(日) 03:38
by NyanCo
ラムダがキャプチャ付きだと引数として渡せないということですか・・・
大変参考になりました。ありがとうございました。