コールバックを取ってC関数をラップしようとすると、メンバー関数が代理人とみなされるという問題が発生しました。 Cの関数は、デリゲートを取ることはないので、私は別のものに落ち着い:あなたが見ることができるように、私はメンバーになるデリゲートを(呼び出しリテラルコールバック設定機能に関数を渡しているこの関数はなぜデリゲートと見なされますか?
extern(C) void onMouse(void delegate(int, int, int) nothrow callback)
{
glfwSetMouseButtonCallback(handle,
function void (GLFWwindow* h, int button, int action, int mods) nothrow
{
callback(button, action, mods);
}
);
}
私がここを通過する関数)。
エラーでError: function pointer glfwSetMouseButtonCallback (GLFWwindow*, extern (C) void function(GLFWwindow*, int, int, int) nothrow) is not callable using argument types (GLFWwindow*, void delegate(GLFWwindow* h, int button, int action, int mods) nothrow @system)
は、それがタイプvoid delegate
通りであるとして、第2のパラメータを示しています
しかし、それは私が期待どおりに終わることはありません。
So.私の質問です:なぜこれが起こるのですか?明らかに分かるように、コードにはfunction void
と書かれています。
注:私はこれを見ました:Pass delegates to external C functions in D。 解決策は明らかにハックです。しかし、私はインターネット上で回避策を見つけることができない場合、私はそれを試してみます。
"C"とC++の主な問題は、関数の* linkage *のようです。私には、CやC++リンケージであると思われる「デリゲート」は、あなたが望むものが何であるかは、あまり明確ではありません。 – tofro
@tofroわかりません。デリゲートリテラルは単なる関数リテラルで、 'this'が付いているため、Cと互換性がなくなり、何らかの理由で関数リテラルに簡単に変換できなくなります。 –
コンパイラのメッセージを注意深く見てください。 'glfwSetMouseButtonCallback()'が第2引数としてextern "C"関数ポインタを取ると言っています。しかし、代わりにC++の関数ポインタ( 'delegate')を渡しています。これら2つのタイプは互換性がありません。 – tofro