2

私は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:'型キャスト':'オーバーロードされた関数'から'void(__thiscall Critter :: Body :: *)(Ogre :: Vector3)'に変換できません

しかし、とにかく問題が発生するのは、この関数が継承されているためです(それはから来てNxOgre::Actor::いるので、とにかく正しいアプローチではありません


編集2:

3つのfloatをパラメーターとして使用して関数のバージョンをバインドしようとしましたが、驚くべきことに、すべてが正常にコンパイルされますが、vector3を使用したバージョンはコンパイルされません。

これは私が3つのfloat関数を実装するために使用したものです:

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

私はこれについて困惑しています;(

4

2 に答える 2

1

この質問は今ではかなり古いようですが、最新の編集に対する答えがまだないので、私は考えました。

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

キャスト先の関数型にconst修飾子とreference-ampersandがありません。それは次のようになります:

(( void(Critter::Body::*)(const Vector3&) ) &Critter::Body::setGlobalPosition)
于 2012-02-06T10:21:49.163 に答える
0

DeadMGが指摘したように、メンバー関数の前にアンパサンドがありません。リンクしたチュートリアルにもそれがありません。一部のコンパイラは気にしないかもしれませんが、g ++は気にし、おそらく他のコンパイラも気にします。

于 2011-04-24T17:02:52.697 に答える