Luabind: не найдено подходящей перегрузки, кандидаты:

Обратите внимание: я прочитал и применил ответ к: Вызов функции-члена C++ из Luabind приводит к тому, что соответствующая перегрузка не найдена, но это не решило мою проблему.

У меня есть простой класс, который я открываю для LUA через luabind.

Вот код привязки:

void LogManager::luaBindImpl() const
{
    using namespace luabind;
    lua_State* state(Supervisor::getSingleton().getManager<LuaManager>()->state());

    // LogManager
    module(state)
    [
        class_<LogManager>("LogManager")
        .enum_("LogType")
        [
             value("Info", 1)
            ,value("Warning", 2)
            ,value("Critical", 3)
            ,value("Debug", 4)
        ]
        .def("log", &LogManager::log)
        .def("registerSource", &LogManager::registerSource)
    ];

    // Add to globals
    globals(state)["LogManager"] = this;
};  // eo luaBindImpl

А вот мой LUA:

LogManager.registerSource("lol");

Но я получаю сообщение об ошибке, упомянутое в заголовке (это взято прямо из моего файла журнала):

00:00:00:0520- lua:Exception - No matching overload found, candidates:
void registerSource(LogManager&,std::string const&)

Я рву на себе волосы из-за этого и не вижу, что я делаю неправильно. Кто-нибудь может пролить свет?! :)


person Moo-Juice    schedule 27.05.2011    source источник


Ответы (1)


В части Lua вам нужно использовать двоеточие (:) вместо точки:

LogManager:registerSource("lol");

И вы понимаете, что глобальная переменная LogManager имеет то же имя, что и класс LogManager; таким образом вы не сможете использовать константы перечисления, например. LogManager.Info вернет ноль.

person sbk    schedule 27.05.2011
comment
Спасибо за ответ. Я изменил глобальное значение на LM и изменил его на LM:registerSource("lol");, но все равно получаю ту же ошибку. - person Moo-Juice; 27.05.2011
comment
@Moo-Juice: ну, у меня больше нет идей. Мне удалось точно воссоздать вашу проблему, используя :, исправив ее. Что я могу предложить, так это собрать luabind с информацией об отладке, установить точку останова в function::call (она должна быть в function.cpp, около строки 50) и просто изучить стек Lua и то, как luabind ищет перегрузки. - person sbk; 27.05.2011
comment
@sbk, стало немного интереснее. Видимо, у меня тоже нет tostring или require. Я получаю [string "local tostring = tostring..."]:6: attempt to call local 'tostring' (a nil value). Я думал, что это встроенный? Самый запутанный.... :) - person Moo-Juice; 27.05.2011
comment
Почти ничего не встроено в Lua — чтобы импортировать стандартные функции в вашу среду, вы должны вызвать некоторые luaopen_XXX функции из lualib.h (например, luaopen_io() для ввода-вывода, luaopen_base для tostring и т. д.) или вызвать luaL_openlibs для импорта всего - person sbk; 28.05.2011
comment
@sbk, привет. Да, вы совершенно правы. Добавление тех отсортировало все эти вещи. Интересно, что globals(state)["LM"] = new LogManager() работает по назначению. Просто кажется, что назначение this не выполняется... - person Moo-Juice; 28.05.2011
comment
@Moo-Juice: Теперь, когда вы упомянули, что назначение this не удается, но new LogManager в порядке, у меня есть новое предположение: ваш метод luaBindImpl является константным, следовательно, this равен const LogManager, и я вижу, как это может запутать. Попробуйте сделать luaBindImpl неконстантным или отбросьте константу от this при назначении глобального... - person sbk; 29.05.2011
comment
@Moo-Juice: хе-хе, я только что увидел, что вы задали тот же вопрос в списке рассылки luabind-user и получили почти такой же ответ, так что я думаю, что это будет окончательное решение этой конкретной проблемы :) - person sbk; 29.05.2011
comment
Это действительно было так! Теперь все идет гладко, спасибо за ваши постоянные усилия :) - person Moo-Juice; 29.05.2011