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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NyanCo

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

#1

投稿記事 by NyanCo » 8年前

はじめまして、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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 8年前

キャプチャ付きのラムダを関数ポインタにキャストすることはできません。

NyanCo

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

#3

投稿記事 by NyanCo » 8年前

ラムダがキャプチャ付きだと引数として渡せないということですか・・・
大変参考になりました。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る