Проблема: я завернул немного кода на С ++ в python, используя SWIG.Что касается Python, я хочу взять завернутый указатель c ++ и уменьшить его до указателя на подкласс.Я добавил новую функцию c ++ в SWI-файл .i, который выполняет преобразование, но когда я вызываю ее из python, я получаю TypeError.
Вот подробности:
У меня есть два класса c ++, Base и Derived.Производный является подклассом Base.У меня есть третий класс, контейнер, который содержит производное и обеспечивает доступ к нему.Метод доступа возвращает Derived в виде константы Base &, как показано:
class Container {
public:
const Base& GetBase() const {
return derived_;
}
private:
Derived derived_;
};
Я обернул эти классы в python, используя SWIG.В моем коде на Python я хотел бы уменьшить базовую ссылку обратно до производного.Чтобы сделать это, я записал в файл swig .i вспомогательную функцию на c ++, которая выполняет преобразование:
%inline %{
Derived* CastToDerived(Base* base) {
return static_cast<Derived*>(base);
}
%}
В своем коде на языке Python я вызываю функцию понижающего преобразования:*
base = container.GetBase()
derived = CastToDerived(base)
При этом я получаю следующую ошибку:
TypeError: in method 'CastToDerived', argument 1 of type 'Base *'
Почему это может происходить?
Для справки, здесь приведены соответствующие биты файла .cxx, сгенерированного SWIG;а именно, исходная функция и его двойник с интерфейсом Python:
Derived* CastToDerived(Base* base) {
return static_cast<Derived*>(base);
}
// (lots of other generated code omitted)
SWIGINTERN PyObject *_wrap_CastToDerived(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
Base *arg1 = (Base *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
Derived *result = 0 ;
if (!PyArg_ParseTuple(args,(char *)"O:CastToDerived",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Base, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CastToDerived" "', argument " "1"" of type '" "Base *""'");
}
arg1 = reinterpret_cast< Base * >(argp1);
result = (Derived *)CastToDerived(arg1);
resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Derived, 0 | 0 );
return resultobj;
fail:
return NULL;
}
Любая помощь будет принята с благодарностью.
- Matt