从Luabind调用C ++成员函数导致“找不到匹配的重载”

时间:2011-04-27 03:15:19

标签: c++ lua luabind

我在DLL中导出了一些导出到Luabind的类,一切都适用于这两个类(LuaScriptManager,EventManager)。 我可以从Lua调用它们的函数,一切都很好,但是现在我正在尝试在我的客户端可执行文件中设置一个与DLL链接的新类,到目前为止还没有运气。

以下是我为每个函数调用的错误消息: “找不到匹配的重载,候选:void loadResource(ResourceManager&,std :: string const&)”

类绑定来自http://www.nuclex.org/articles/5-cxx/1-quick-introduction-to-luabind

struct Manager {
Manager() :
m_ResourceCount(0) {}

void loadResource(const std::string &sFilename) {
++m_ResourceCount;
}
size_t getResourceCount() const {
return m_ResourceCount;
}

size_t m_ResourceCount;
};
static Manager MyResourceManager;

void Bind(lua_State* l)
{
    // Export our class with LuaBind
    luabind::module(l) [
    luabind::class_<Manager>("ResourceManager")
    .def("loadResource", &Manager::loadResource)
    .property("ResourceCount", &Manager::getResourceCount)
    ];

    luabind::globals(l)["MyResourceManager"] = &MyResourceManager;
}

这是相应的lua测试代码:

-- The following call will fail with the above error
MyResourceManager:loadResource("abc.res")
--MyResourceManager:loadResource("xyz.res")

-- If the function is commented out, this will work (accessing the property)
ResourceCount = MyResourceManager.ResourceCount

-- Calling my other classes' functions work fine
LuaScriptManager.GetInstance():WriteLine(ResourceCount)

这种奇怪行为可能是什么原因?

1 个答案:

答案 0 :(得分:5)

这是我发送到Luabind邮件列表的邮件的副本。 http://sourceforge.net/mailarchive/message.php?msg_id=27420879

我不确定这是否也适用于Windows和DLL,但我有类似的 在Linux上使用GCC和共享模块的经验:已注册的类 与Luabind一起只在该共享库中有效,但是造成了 如果跨共享库边界使用,则会出现分段错误。

解决方案是修补luabind :: type_id类,并进行比较 使用typeid(T).name()而不是typeid(T):: operator =。对于海湾合作委员会来说 为什么typeid运算符可能无法跨共享库工作 这里解释[1]。在这种特殊情况下,我加载了共享 带有Lua的require()的库,遗憾的是,它没有通过 RTLD_GLOBAL to dlopen。

[1] http://gcc.gnu.org/faq.html#dso

typeid等式问题出现在其他C ++库中,例如: 在boost :: any [2]中,使用相同的fix [3],typeid(T).name()比较。

[2] https://svn.boost.org/trac/boost/ticket/754
[3] https://svn.boost.org/trac/boost/changeset/56168

也许附加的补丁也有助于DLL的情况。

--- include.orig/luabind/typeid.hpp
+++ include/luabind/typeid.hpp
@@ -6,6 +6,7 @@
 # define LUABIND_TYPEID_081227_HPP

 # include <boost/operators.hpp>
+# include <cstring>
 # include <typeinfo>
 # include <luabind/detail/primitives.hpp>

@@ -33,17 +34,17 @@

     bool operator!=(type_id const& other) const
     {
-        return *id != *other.id;
+        return std::strcmp(id->name(), other.id->name()) != 0;
     }

     bool operator==(type_id const& other) const
     {
-        return *id == *other.id;
+        return std::strcmp(id->name(), other.id->name()) == 0;
     }

     bool operator<(type_id const& other) const
     {
-        return id->before(*other.id);
+        return std::strcmp(id->name(), other.id->name()) < 0;
     }

     char const* name() const