如何使用Luabind绑定重载函数?

时间:2011-04-24 16:22:54

标签: c++ scripting lua luabind

我正在用c ++编写一个游戏引擎,它将提供Lua脚本(我正在使用Luabind包装)并且我遇到了绑定重载函数的一些问题。即:我有重载功能:

void setGlobalPosition(const Vec3& position);

void setGlobalPosition(Real x, Real y, Real z);

我想将这两个暴露给lua。 显然这是错误的:

luabind::module(L)[ luabind::class_<Critter::Body>("Body") .def("setGlobalPosition", &Critter::Body::setGlobalPosition ) ];

我已经找到了一种方法在这个网站http://www.codeproject.com/KB/graphics/luabindLuaAndOgre3d.aspx?msg=3376320(非常好的Luabind教程 - 我强烈推荐它)这样做:

luabind::module(L)[ luabind::class_<Critter::Body>("Body") .def("setGlobalPosition", (void( Critter::Body::*)(const Vector3&))Critter::Body::setGlobalPosition ) ];

但它也给了我错误(如果有人感兴趣,我可以附上它们。)

我也试过了 .def("setGlobalPosition", Critter::Body::setGlobalPosition<Vector3> ) 但仍然是错误。

任何想法我该怎么办?


编辑: 好的,我已经找到了这样做的方法:

.def("setGlobalPosition", ( void(Critter::Body::*)(Vector3) ) &Critter::Body::setGlobalPosition )
来自luabind文档的

但我得到错误(第一个):

  

错误C2440:'type cast':不能   从'overloaded-function'转换为   'void(__ thiscall Critter :: Body :: *   )(食人魔::的Vector3)'

但无论如何问题出现了,因为这个函数是继承的(它来自NxOgre::Actor::所以我不是那个正确的方法


编辑2:

我刚刚试图用3个浮点数作为参数来绑定函数的版本......令人惊讶的是,所有编译都很好但是带有vector3的版本没有... :(

这是我用来实现3浮点函数的东西:

.def("setGlobalPosition", ( void(Critter::Body::*)(float,float,float) ) &Critter::Body::setGlobalPosition )

我对此感到难过;(

2 个答案:

答案 0 :(得分:1)

这个问题现在看起来已经很老了,但我想你还没有得到你最新编辑的答案:

(( void(Critter::Body::*)(Vector3) ) &Critter::Body::setGlobalPosition)

缺少要转换为的函数类型中的const限定符和reference-ampersand。它必须是:

(( void(Critter::Body::*)(const Vector3&) ) &Critter::Body::setGlobalPosition)

答案 1 :(得分:0)

正如DeadMG指出的那样,你在成员函数之前缺少一个&符号。您链接的教程也缺少它。有些编译器可能不关心,但是g ++确实可能,而且其他一些编译器也可以。