Предоставление очереди STL Lua через Luabind - PullRequest
0 голосов
/ 07 июля 2011

Я пытаюсь заменить существующую реализацию класса очереди, написанного на Lua, на класс очереди STL.Я не уверен, почему это не удается, или как подойти, чтобы это исправить.Ниже приведен пример кода, который демонстрирует такое же поведение, наряду с выводом ошибки.Заранее спасибо!

#include 
#include 

struct XYZ_T
{
    short x, y, z;
};

typedef std::queue XYZ_QUEUE_T;

extern "C" int init(lua_State *L)
{
    using namespace luabind;

    open(L);

    module(L)
    [
        class_("XYZ_T")
            .def(constructor<>())
            .def_readwrite("x", &XYZ_T::x)
            .def_readwrite("y", &XYZ_T::y)
            .def_readwrite("z", &XYZ_T::z),

        class_("XYZ_QUEUE_T")
            .def(constructor<>())
            .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: In function `int init(lua_State*)':
test_luabind.cpp:27: error: no matching function for call to `
   luabind::class_<XYZ_QUEUE_T, luabind::detail::unspecified, 
   luabind::detail::unspecified, luabind::detail::unspecified>::def(const 
   char[6], <unknown type>)'
test_luabind.cpp:32: error: parse error before `(' token

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

Скорее всего, у вас есть перегруженная функция в вашей реализации очереди. Таким образом, когда вы берете адрес, компилятор не знает, что делать, потому что вы можете иметь в виду любую перегруженную функцию.

2 голосов
/ 07 июля 2011

Как указывает 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 включает пример этого .

0 голосов
/ 07 июля 2011

Это:

class_("XYZ_QUEUE_T")

Должно быть:

class_<XYZ_QUEUE_T>("XYZ_QUEUE_T")

Строка - это имя типа, которое видит Lua, а параметр шаблона - тип C ++, который вы используете.

О, и не очень хорошо выставлять очередь Lua, если вы не выставляете объекты, которые хранит очередь.

...