我正在尝试从与Luabind绑定的方法返回std :: shared_ptr,但它似乎无法识别该类型。
Luabind代码:
module(lua)
[
class_<Character, BaseEntity, std::shared_ptr<Character> > ("Character"),
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));
}
如果我在Lua脚本中调用此方法,则不会返回任何内容,并且执行将在那里停止。但是,如果我更改方法以返回Character *,它将按预期工作。一些谷歌搜索告诉我,返回shared_ptr应该不是问题。
我做错了什么?
另外,我有这个代码,所以Luabind可以理解std :: shared_ptr:
namespace luabind
{
template <typename T>
T* get_pointer(std::shared_ptr<T> const& p)
{
return p.get();
}
}
答案 0 :(得分:4)
我必须解决同样的问题。
这有点复杂。基本上你需要用原型
定义一个函数template <typename T>
T* get_pointer(std::shared_ptr<T> const&);
此函数还必须与std::shared_ptr
位于同一名称空间中,因此std::
。请注意,全局命名空间或luabind
命名空间中的函数与您的无效,因为luabind使用special tricks来确保仅检查某个类型是否为智能指针时使用ADL。避免这种情况的唯一方法是在luabind::detail::has_get_pointer_
命名空间中定义您的函数,而不仅仅是luabind
。
但是,仅在此命名空间中定义您的函数也不会起作用(至少对于Boost&lt; 1.53)。尽管在C ++标准中技术上不允许在命名空间std
中定义函数,但它是Boost&lt; 1.53的唯一可行方法。但是,从1.53开始,Boost为boost::get_pointer()
(和std::shared_ptr
)定义了自己的std::unique_ptr
重载。对于这个版本,它足以使get_pointer()
命名空间中的Boost luabind::detail::has_get_pointer_
可见,因为luabind在使用智能指针的任何地方都是using
(参见luabind/get_pointer.hpp
标题)。定义std
中的函数甚至不会起作用,因为luabind会引起一个模糊的调用。
因此,如果您希望get_pointer()
的{{1}}重载适用于Boost&lt; 1.53和&gt; = 1.53以及MSVC 10(可能是9)(这些定义std::shared_ptr
在shared_ptr
而不是std::tr1
)中,我可以为您提供我的(历史性增长;-))标题:
std