J'utilise luabind comme wrapper Lua vers C++. Luabind offre une méthode pour utiliser ma propre fonction callback pour gérer les exceptions lancées par lua, set_pcall_callback(). J'ai donc paraphrasé un exemple de la documentation, les changements étant la fonction logger->log() et le fait de mettre la fonction dans une classe appelée 'Engine', donc au lieu d'être une fonction globale normale, c'est maintenant une fonction membre, ce qui semble être l'origine de mon problème.
Voici les extraits de code pertinents :
class Engine //Whole class not shown for brevity
{
public:
Engine();
~Engine();
void Run();
int pcall_log(lua_State*);
private:
ILogger *logger;
};
Engine::Run()
{
lua_State* L = lua_open();
luaL_openlibs(L);
open(L);
luabind::set_pcall_callback(&Engine::pcall_log); //<--- Problem line
//etc...rest of the code not shown for brevity
}
int Engine::pcall_log(lua_State *L)
{
lua_Debug d;
lua_getstack( L,1,&d);
lua_getinfo( L, "Sln", &d);
lua_pop(L, 1);
stringstream ss;
ss.clear();
ss.str("");
ss << d.short_src;
ss << ": ";
ss << d.currentline;
ss << ": ";
if ( d.name != 0)
{
ss << d.namewhat;
ss << " ";
ss << d.name;
ss << ") ";
}
ss << lua_tostring(L, -1);
logger->log(ss.str().c_str(),ELL_ERROR);
return 1;
}
Voici ce que dit le compilateur pendant la compilation :
C:\pb\engine.cpp|31|error: cannot convert 'int (Engine::*)(lua_State*)' to 'int (*)(lua_State*)' for argument '1' to 'void luabind::set_pcall_callback(int (*)(lua_State*))'|
Il semble donc que l'erreur soit due au fait que la fonction attend un pointeur de fonction ordinaire, et non un pointeur de fonction de membre de classe. Existe-t-il un moyen de couler ou d'utiliser un pointeur de fonction intermédiaire à transmettre à la fonction set_pcall_callback() ?
Merci !