Я ответил на этот вопрос, объяснив, как перевести объединение с c++ на python с помощью SIP (объединения не поддерживаются автоматически).
Когда я использую этот тип упаковки для объединения внутри существующей структуры, я получаю следующее сообщение об ошибке при попытке сборки с помощью sip-install (я переименовал «wrapped_u» в «u» и «test_u» в «type_u»):
error: field 'u' has incomplete type 'type_u'
и
note: forward declaration of ‘union type_u’
.
Вот заголовочный файл С++:
struct myType{
enum {CHAR, INT, DOUBLE} tag;
union type_u{
/* tag = CHAR */
char char_value;
/* tag = INT */
int int_value;
/* tag = DOUBLE */
double double_value;
};
type_u u;
void print_my_type() const;
};
а это SIP-файл:
struct myType{
enum tag {CHAR, INT, DOUBLE};
struct union_wrapper /PyName=type_u/
{
%TypeHeaderCode
#include <test_struct_union.h>
struct union_wrapper
{
union type_u u;
};
%End
// tag = CHAR
char char_value {
%GetCode
sipPy = PyUnicode_FromString(&(sipCpp->u.char_value));
%End
%SetCode
if (PyUnicode_Check(sipPy))
sipCpp->u.char_value;
else
sipErr = 1;
%End
};
// tag = INT
int int_value {
%GetCode
sipPy = PyLong_FromLong(sipCpp->u.int_value);
%End
%SetCode
if (PyLong_Check(sipPy))
sipCpp->u.int_value;
else
sipErr = 1;
%End
};
// tag = DOUBLE
double double_value {
%GetCode
sipPy = PyFloat_FromDouble(sipCpp->u.double_value);
%End
%SetCode
if (PyFloat_Check(sipPy))
sipCpp->u.double_value;
else
sipErr = 1;
%End
};
};
void print_my_type() const;
};
Кто-нибудь знает, как это решить?
Заранее спасибо!
Джонни
Объединения поддерживаются, начиная с Sip версии 6.0.0.
Спасибо за быструю интеграцию Riverbank Computing.
Надеемся, что ручной способ сделать перевод больше не понадобится.