Geri aramalar alarak bir C işlevi sarmak amacıyla üye işlevleri olarak delege olarak görülen sorunla karşılaştım. C fonksiyonu delegeleri kabul etmedi, bu yüzden yerine başka bir şey üzerinde yerleşmiş: Gördüğünüz gibi, ben üye olacak bir temsilci (çağırarak değişmez geri arama ayarı fonksiyonu için bir işlev geçiyorumBu işlev neden delege olarak görünüyor?
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);
}
);
}
işlev buraya geçiyorum).
hata olarakError: 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)
, tip void delegate
olarak olarak ikinci parametre gösterilmektedir:
Ancak, ben beklendiği gibi sonuna kadar değildir.
So. Sorum şu: neden bu oluyor? Açıkça görebildiğiniz gibi, kodda function void
diyor.
Not: Bunu gördüm: Pass delegates to external C functions in D. Çözüm görünüşe göre bir kesmek. Ama internette bir çözüm bulamazsam deneyeceğim.
Ana probleminiz, "C" ve "C++" işlevleri için * bağlantı * gibi görünüyor. Benim için ne * istediğini çok açık değil * Olması gereken - C veya C++ bağlantısı olması gereken "delege" dir? – tofro
@tofro Korkarım ki anlamıyorum. Temsilci edebi, yalnızca 'bu' ekli bir işlev değişkeni olup, onu C ile uyumsuz kılar ve (bir sebepten dolayı) kolaylıkla bir işlev değişkeni haline dönüştürülemez. –
Derleyici iletilerini yakından izleyin. 'GlfwSetMouseButtonCallback() 'ın ikinci argüman olarak bir' extern 'C'' fonksiyon göstergesini alacağını söylediniz. Ancak bunun yerine bir C++ işlev işaretçisi ("temsilci") teslim ediyorsunuz. Bu iki tip uyumlu değildir. – tofro