Предоставление очереди STL Lua через Luabind

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

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

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

typedef std::queue<XYZ_T> XYZ_QUEUE_T;

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

    open(L);

    module(L)
    [
        class_<XZY_T>("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>("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

person Joe    schedule 06.07.2011    source источник


Ответы (3)


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

person Puppy    schedule 06.07.2011
comment
Если это правда, то это будет std::queue::front, который имеет const и неконстантную версию. back есть похожие версии. - person Nicol Bolas; 07.07.2011
comment
Превосходно! Это было именно то. Теперь это кажется таким очевидным :-) - person Joe; 07.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 есть пример .

person Georg Fritzsche    schedule 07.07.2011

Этот:

class_("XYZ_QUEUE_T")

Должно быть:

class_<XYZ_QUEUE_T>("XYZ_QUEUE_T")

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

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

person Nicol Bolas    schedule 06.07.2011
comment
Да, у меня это было, но я забыл кодировать символ в HTML. Кроме того, определение XYZ_T, похоже, не повлияло на проблему. Короче говоря, та же проблема :-( - person Joe; 07.07.2011