Llamar a la función miembro de C ++ desde Luabind causa “No se encontró una sobrecarga coincidente”

Tengo algunas clases exportadas a Luabind en una DLL, y todo funciona bien para esas 2 clases (LuaScriptManager, EventManager). Puedo llamar a sus funciones desde Lua y todo está bien, pero ahora estoy tratando de configurar una nueva clase en el ejecutable de mi cliente que se vincula con la DLL y hasta ahora no hay suerte en absoluto.

Aquí está el mensaje de error que recibo por cada función que llamo: “No se encontró una sobrecarga coincidente, candidatos: void loadResource (ResourceManager &, std :: string const &)”

La clase de enlace es de 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_("ResourceManager") .def("loadResource", &Manager::loadResource) .property("ResourceCount", &Manager::getResourceCount) ]; luabind::globals(l)["MyResourceManager"] = &MyResourceManager; } 

Y aquí está el correspondiente código de prueba de 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) 

¿Cuál podría ser la causa de este extraño comportamiento?

Esta es una copia de un correo que envié a la lista de correo de Luabind. http://sourceforge.net/mailarchive/message.php?msg_id=27420879

No estoy seguro de que esto se aplique también a Windows y DLL, pero tuve una experiencia similar con GCC y los módulos compartidos en Linux: las clases registradas con Luabind solo eran válidas dentro de esa biblioteca compartida, pero causaron fallas de segmentación si se usaban a través de los límites de las bibliotecas compartidas .

La solución fue parchear la clase luabind :: type_id y comparar usando typeid (T) .name () en lugar de typeid (T) :: operator =. Para GCC, la razón por la que el operador typeid podría no funcionar en bibliotecas compartidas se explica aquí [1]. En este caso particular, cargué la biblioteca compartida con Lua’s require (), que, desafortunadamente, no pasa RTLD_GLOBAL a dlopen.

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

El problema de igualdad tipográfica ha aparecido en otras bibliotecas de C ++, por ejemplo, en boost :: any [2], con la misma corrección [3], tipo de comparación (T) .name ().

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

Tal vez el parche adjunto ayuda en el caso de DLL, también.

 --- include.orig/luabind/typeid.hpp +++ include/luabind/typeid.hpp @@ -6,6 +6,7 @@ # define LUABIND_TYPEID_081227_HPP # include  +# include  # include  # include  @@ -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