我使用 luabind 作为我的 lua 到 C++ 包装器。Luabind 提供了一种方法来使用我自己的回调函数来处理 lua 抛出的异常,set_pcall_callback()。所以我解释了文档中的一个示例,更改是 logger->log() 函数并将该函数放在一个名为“Engine”的类中,因此它不再是常规的全局函数,而是现在的成员函数,即我的问题似乎出在哪里。
以下是相关的代码片段:
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;
}
以下是编译器在编译期间所说的内容:
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*))'|
所以似乎错误在于该函数需要一个常规函数指针,而不是类成员函数指针。有没有办法转换或使用中间函数指针传递给 set_pcall_callback() 函数?
谢谢!