如何使用 SIP 将结构内的联合从 C++ 转换为 python?

How to translate a union inside a struct from c++ to python with SIP?

我回答了 解释了如何使用 SIP 将联合从 C++ 转换为 python(不自动支持联合)。

当我在现有结构中对联合使用这种类型的包装时,我在尝试使用 sip-install 构建时收到以下错误消息(我将 'wrapped_u' 重命名为 'u' 和 'test_u' 到 'type_u'):

error: field 'u' has incomplete type 'type_u'

note: forward declaration of ‘union type_u’.

这是c++头文件:

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。

希望不再需要手动进行翻译。