C++ Luabind:Can';t返回共享\u ptr
我试图从与Luabind绑定的方法返回std::shared\u ptr,但它似乎无法识别类型 Luabind代码:C++ Luabind:Can';t返回共享\u ptr,c++,lua,shared-ptr,luabind,C++,Lua,Shared Ptr,Luabind,我试图从与Luabind绑定的方法返回std::shared\u ptr,但它似乎无法识别类型 Luabind代码: module(lua) [ class_<Character, BaseEntity, std::shared_ptr<Character> > ("Character"), def("createCharacter", &Character::createCharacter) ]; 模块(lua) [ 类(“字符”),
module(lua)
[
class_<Character, BaseEntity, std::shared_ptr<Character> > ("Character"),
def("createCharacter", &Character::createCharacter)
];
模块(lua)
[
类(“字符”),
def(“createCharacter”,&Character::createCharacter)
];
createCharacter代码:
std::shared_ptr<Character> Character::createCharacter(Game* gameInstance, const Character::CharacterSetup& characterSetup, string sprite, b2World* world)
{
return std::shared_ptr<Character>(new Character(gameInstance, characterSetup, sprite, world));
}
std::shared\u ptr Character::createCharacter(游戏*游戏实例,常量Character::CharacterSetup&CharacterSetup,字符串精灵,b2World*世界)
{
返回std::shared_ptr(新角色(游戏实例、角色设置、精灵、世界));
}
如果在Lua脚本中调用此方法,则不会返回任何内容,执行也会停止。但是,如果我将方法更改为返回字符*,它将按预期工作。一些谷歌用户告诉我,返回共享的ptr应该不是问题
我做错了什么
另外,我有这段代码,这样Luabind就可以理解std::shared\u ptr:
namespace luabind
{
template <typename T>
T* get_pointer(std::shared_ptr<T> const& p)
{
return p.get();
}
}
名称空间luabind
{
模板
T*get_指针(std::shared_ptr const&p)
{
返回p.get();
}
}
我必须解决同样的问题
这有点复杂。基本上,您需要用原型定义一个函数
template <typename T>
T* get_pointer(std::shared_ptr<T> const&);
您是否尝试过使用
boost::shared_ptr
?我对luabind不太熟悉,但如果它不存储共享指针,而只是使用get_pointer()获取真实指针,它将删除最后一个引用(从而删除对象),同时保留(现在悬空)指针。首先,确保您的类被正确地设置为不可复制。其次,在构造函数和析构函数中添加断点。谢谢,谢谢。
#ifndef SHAREDPTR_CONVERTER_HPP_INCLUDED
#define SHAREDPTR_CONVERTER_HPP_INCLUDED SHAREDPTR_CONVERTER_HPP_INCLUDED
#include <boost/version.hpp>
#if BOOST_VERSION >= 105300
#include <boost/get_pointer.hpp>
namespace luabind { namespace detail { namespace has_get_pointer_ {
template<class T>
T * get_pointer(std::shared_ptr<T> const& p) { return p.get(); }
}}}
#else // if BOOST_VERSION < 105300
#include <memory>
// Not standard conforming: add function to ::std(::tr1)
namespace std {
#if defined(_MSC_VER) && _MSC_VER < 1700
namespace tr1 {
#endif
template<class T>
T * get_pointer(shared_ptr<T> const& p) { return p.get(); }
#if defined(_MSC_VER) && _MSC_VER < 1700
} // namespace tr1
#endif
} // namespace std
#endif // if BOOST_VERSION < 105300
#endif