Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Luabind:Can';t返回共享\u ptr_C++_Lua_Shared Ptr_Luabind - Fatal编程技术网

C++ Luabind:Can';t返回共享\u ptr

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) [ 类(“字符”),

我试图从与Luabind绑定的方法返回std::shared\u ptr,但它似乎无法识别类型

Luabind代码:

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