Luabind устанавливает свойство производного типа с базовым типом

Я использую LuaBind для предоставления классов С++ сценариям Lua. Я столкнулся с проблемой невозможности привести базовый класс к его производному классу. У меня есть фабричный класс, который возвращает объекты базового типа. Есть некоторые поля типа, производного от базового типа, которые я пытаюсь установить с помощью этих объектов. Я свел свою проблему к некоторому тестовому коду, который может воспроизвести проблему и объяснить ее яснее.

Определения классов С++

class Base {
public:
  virtual void say() { cout << "a" << endl; }
};

class Derived : public Base {
public:
  virtual void say() { cout << "b" << endl; }
};

class TestClass {
public:
  Base *GetBase() { return (Base *)new Derived(); }
  Derived *derivedRef;
};

C++ Код привязки LuaBind

module(L)[
    class_<Base>("Base")
    .def(constructor<>())
    .def("say", &Base::say)];

module(L)[class_<Derived, Base>("Derived")
    .def(constructor<>())
    .def("say", &Derived::say)];

module(L)[class_<TestClass>("TestClass")
    .def(constructor<>())
    .def("GetBase", &TestClass::GetBase)
    .def_readwrite("derivedRef", &TestClass::derivedRef)];

Луа-код

testClass = TestClass()
base = testClass:GetBase()
testClass.derivedRef = base

Ошибка

 occurred executing a LUA script: No matching overload found, candidates: 
 void <unknown>(TestClass&,Derived* const&)

Кто-нибудь знает, возможно ли повышение уровня в LuaBind, и если да, то как мне это сделать?


person Sean Dawson    schedule 10.05.2014    source источник


Ответы (1)


После долгого процесса я решил эту проблему.

Сначала я прочитал здесь, что версия LuaBind I am running (0.9) должен поддерживать автоматическое приведение типов вниз/вверх при передаче в параметры. Это показало, что это возможно.

Затем я узнал здесь, что есть специальный заголовок для преобразования общих указателей (который, как я понял, я использовал). Конвертер, поставляемый с LuaBind, работает только с общими указателями boost. Было довольно просто получить исходный код для конвертера интеллектуальных указателей boost и замените каждый экземпляр boost:: на std:: и внесите несколько небольших изменений чтобы он скомпилировался.

Затем я начал получать ошибки, в которых говорилось

std::runtime_error: 'Trying to use unregistered class'

когда я вызывал методы связывания.

Была версия конвертера общих указателей здесь, но она не скомпилировать на моей машине. Я использовал его в качестве ссылки для создания другого заголовочного файла, который позволяет LuaBind связывать общие указатели из стандартная библиотека.

Короче говоря, включите следующие два файла, и автоматическое преобразование общих указателей вверх/вниз будет работать, когда вы используете версию стандартной библиотеки, а не версию Boost.

Я использую Xcode 5 с компилятором clang и не тестировал его с другим компилятором.

person Sean Dawson    schedule 10.05.2014