Казалось странным, что для boost::shared_ptr
потребуется полный тип для создания экземпляра, поэтому я написал небольшой тест, демонстрирующий обратное (код в конце).
Я считаю, что проблема не в типе, который необходимо завершить, а в том, что второй аргумент, который вы передаете конструктору shared_ptr
, выглядит как функция-член. Второй аргумент должен быть чем-то вызываемым с одним аргументом указателя. Если вы хотите использовать функцию-член вашей оболочки, вы можете использовать boost::bind
для адаптации интерфейса.
Может быть, вы имели в виду?:
LuaState(): L( luaL_newstate(), boost::bind(LuaState::CustomDeleter,this,_1) )
{
}
Демонстрация того, что boost::shared_ptr
не требует полных типов:
// forward declarations
struct test;
test * create();
void destroy(test *);
// wrapper equivalent to the one in the question
struct wrapper {
boost::shared_ptr<test> sp;
wrapper() : sp( create(), destroy ) {}
};
// actual definitions
struct test {};
test * create() { return new test; }
void destroy(test *t) { delete t; }
// make it executable
int main() {
test t;
}