0

Luaで記述されたキュークラスの既存の実装をSTLキュークラスに置き換えようとしています。なぜこれが失敗するのか、またはそれを修正する方法がわかりません。以下は、エラー出力とともに同じ動作を示すサンプルコードです。前もって感謝します!

#include <luabind / luabind.hpp>
#include <queue>

構造体XYZ_T
{{
    短いx、y、z;
};

typedef std :: queue <XYZ_T> XYZ_QUEUE_T;

extern "C" int init(lua_State * L)
{{
    名前空間luabindを使用します。

    open(L);

    モジュール(L)
    [
        class_ <XZY_T>( "XYZ_T")
            .def(コンストラクタ<>())
            .def_readwrite( "x"、&XYZ_T :: x)
            .def_readwrite( "y"、&XYZ_T :: y)
            .def_readwrite( "z"、&XYZ_T :: z)、

        class_ <XYZ_QUEUE_T>( "XYZ_QUEUE_T")
            .def(コンストラクタ<>())
            .def( "push"、&XYZ_QUEUE_T :: push)
            .def( "pop"、&XYZ_QUEUE_T :: pop)
            .def( "front"、&XYZ_QUEUE_T :: front)
            .def( "back"、&XYZ_QUEUE_T :: back)
            .def( "empty"、&XYZ_QUEUE_T :: empty)
            .def( "size"、&XYZ_QUEUE_T :: size)
    ];
}


そしてgcc出力:

g ++ -o test_luabind.os -c -fPIC -Iinclude -I $ VALID_INCLUDE_DIR / packages / build_env / include test_luabind.cpp
test_luabind.cpp:関数 `int init(lua_State *)':
test_luabind.cpp:27:エラー:`の呼び出しに一致する関数がありません
   luabind :: class_ <XYZ_QUEUE_T、luabind :: detail :: unspecificed、
   luabind :: detail :: unspecified、luabind :: detail :: unspecific> :: def(const
   char [6]、<不明なタイプ>) '
test_luabind.cpp:32:エラー: `('トークンの前にエラーを解析します
4

3 に答える 3

4

ほとんどの場合、キューの実装にオーバーロードされた関数があります。したがって、アドレスを取得すると、オーバーロードされた関数を意味する可能性があるため、コンパイラは何をすべきかわかりません。

于 2011-07-06T23:35:53.487 に答える
2

DeadMGが指摘しているように、オーバーロードされた関数の場合、どのバージョンを選択するかをコンパイラーに指示する必要がありconstます。

typedef const XYZ_QUEUE_T::value_type& (XYZ_QUEUE_T::*ConstRefConstType)() const;

class_<XYZ_QUEUE_T>("XYZ_QUEUE_T")
    // ...
    .def("front", (ConstRefConstType)&XYZ_QUEUE_T::front)
    .def("back" , (ConstRefConstType)&XYZ_QUEUE_T::back)
    // ...

luabindのドキュメントには、この例が含まれています。

于 2011-07-07T09:01:55.320 に答える
0

これ:

class_("XYZ_QUEUE_T")

する必要があります:

class_<XYZ_QUEUE_T>("XYZ_QUEUE_T")

文字列はLuaに表示される型名であり、テンプレートパラメーターは使用しているC++型です。

ああ、キューに格納されているオブジェクトを公開しない場合、キューをLuaに公開することはほとんど役に立ちません。

于 2011-07-06T22:58:05.243 に答える