LINUX.ORG.RU

Связывание C++ и Python - контроль типов аргументов в SWIG и namespace


0

1

Есть хидер(ы) (C++), в котором в пространстве имен aiv определена куча всяких классов и ф-й.

Вот метод класса (ф-я, без разницы), которая принимает некий аргумент - класс из того же пространства:

namespace aiv{ class A{...}; ... void func( A& ){...}; };

Собираем, вызываем из питон - не работает: NotImplementedError: Wrong number of arguments for overloaded function 'func'. Possible C/C++ prototypes are: func(A &)

А если так void func( aiv::A& ){...};

то работает.

Я даже понимаю отчего оно - в СВИГЕ есть система контроля типов аргументов (и на ней работет перегрузка), и для нее A и aiv::A вещи разные ес-но. Я тока не понимаю как ей объяснить что это одно и то же... Свиговая команда namespace aiv{...} в i-файле не помогает, симптоматика та же, писать везде aiv:: не true, тем более я их недавно стер (столяи чтоб собирались _wrap.cxx, потом сообразил что туда моно залудить using namespace aiv;).

★★★★★

Ответ на: комментарий от fluorite

Да. Я почти уже смирился - в доках ничего нарыть не удалось... Проблемы начинаются, когда объект созданный в одной so-шке суется аргументом в ф-ю другой so-шки. С-но вот кусок из _wrap.cxx куда объект передается

/* -------- TYPES TABLE (BEGIN) -------- */

#define SWIGTYPE_p_Istream swig_types[0] //без aiv::, неправильно
#define SWIGTYPE_p_Ostream swig_types[1]
#define SWIGTYPE_p_aiv__Istream swig_types[2] //с aiv::, правильно
#define SWIGTYPE_p_aiv___base_mem swig_types[3]
#define SWIGTYPE_p_aiv__arrayT_double_2_t swig_types[4]
#define SWIGTYPE_p_aiv__arrayT_double_3_t swig_types[5]
#define SWIGTYPE_p_aiv__indxT_3_t swig_types[6]
#define SWIGTYPE_p_aiv__meshT_double_2_t swig_types[7]
#define SWIGTYPE_p_aiv__meshT_double_3_t swig_types[8]
#define SWIGTYPE_p_aiv__vctrT_3_double_t swig_types[9]
#define SWIGTYPE_p_char swig_types[10]
#define SWIGTYPE_p_double swig_types[11]
#define SWIGTYPE_p_int swig_types[12]
static swig_type_info *swig_types[14];
static swig_module_info swig_module = {swig_types, 13, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)

/* -------- TYPES TABLE (END) -------- */

А вот откуда (модуль где он создается):

#define SWIGTYPE_p_aiv__Istream swig_types[5]


ИМНО не лечится. Хорошо, что проялвяется только для обычных классов (и у меня мало), а для шаблонов у меня при инстатицровании стоит aiv:: и все работает.

AIv ★★★★★
() автор топика
Ответ на: комментарий от fluorite

Мдя... Ок, спасибо. Тема закрыта.

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.