Интеграция luabind С++ 11, сбой функции

Я экспериментирую с интеграцией LUA в свою программу с помощью luabind, но наткнулся на большой камень преткновения.

Я очень не знаком с соглашениями о вызовах LUA и чувствую, что упускаю что-то простое.

Вот мой код С++:

struct app_t
{
    //...
    void exit();
    void reset();

    resource_mgr_t resources;
    //...
};

struct resource_mgr_t
{
    //...
    void prune();
    void purge();
    //...
};

extern app_t app;

И мои luabind модули:

luabind::module(state)
    [
        luabind::class_<resource_mgr_t>("resource_mgr")
        .def("prune", &resource_mgr_t::prune)
        .def("purge", &resource_mgr_t::purge)
    ];

luabind::module(state)
    [
        luabind::class_<app_t>("app")
        .def("exit", &app_t::exit)
        .def("reset", &app_t::reset)
        .def_readonly("resources", &app_t::resources)
    ];

luabind::globals(state)["app"] = &app;

Я могу выполнить следующие команды lua просто отлично:

app:exit()
app:reset()

Однако следующий вызов завершается ошибкой:

app.resources:purge()

Со следующей ошибкой:

[string "app.resources:purge()"]:1: attempt to index field 'resources' (a function value)

Любая помощь очень ценится!


person Colin Basnett    schedule 09.10.2014    source источник


Ответы (1)


При связывании элементов, не являющихся примитивными, автоматически сгенерированная функция получения вернуть ссылку на него.

И, как и в app:reset(), resources является полем-членом экземпляра.

Итак, используйте его следующим образом:

app:resources():purge()
person Tom Blodget    schedule 09.10.2014
comment
app:resources():purge() теперь выдает ошибку времени выполнения luabind: property_tag function can't be called. - person Colin Basnett; 09.10.2014
comment
Попробуйте app.resources():purge(). (Я не могу проверить прямо сейчас.) - person Tom Blodget; 09.10.2014
comment
Я получаю ту же ошибку :( Видимо, мне нужно пересобрать библиотеки luabind. (gamedev.net/topic/593408-def-readwrite-dosent-work) Я столкнулся со странными ошибками, такими как простое включение <luabind/operator.hpp>, из-за которого программа не компилировалась. - person Colin Basnett; 09.10.2014
comment
Я пересобрал все библиотеки, теперь они кажутся немного более стабильными (например, теперь я могу использовать вещи в <luabind/operator.hpp>). Тем не менее, я все еще не могу запустить эту команду без той же ошибки, которая возвращается ко мне. :/ Я помню, что слышал что-то о необходимости создания оберток объектов, применимо ли это здесь? - person Colin Basnett; 10.10.2014
comment
Для тех, кто сталкивался с этим, я остановился на Python вместо Lua... он значительно проще в использовании и лучше документирован. - person Colin Basnett; 07.07.2016