在union中构造struct

Gra*_*eme 2 c++ struct unions

我创建了一个包含uint64_t和struct的联合.我希望union构造函数构造内部结构,但我似乎无法使它工作.以下是我尝试的几种变体:

union subid_u
{
    inline subid_u(uint32_t gid_, uint32_t sid_)
        : detail.gid(gid_), detail.sid(sid_) {}

    struct detail_t
    {
        uint32_t gid;
        uint32_t sid;
    };

    detail_t    detail;
    uint64_t    subscriptionID;
};
//main.cpp: In constructor 'subid_u::subid_u(uint32_t, uint32_t)':
//main.cpp:7: error: expected `(' before '.' token
//main.cpp:7: error: expected `{' before '.' token


union subid_u
{
    inline subid_u(uint32_t gid_, uint32_t sid_)
        : detail(gid_, sid_) {}

    struct detail_t
    {
        inline detail_t(uint32_t g, uint32_t s)
            : gid(g), sid(s) {}

        uint32_t gid;
        uint32_t sid;
    };

    detail_t    detail;
    uint64_t    subscriptionID;
};
//main.cpp:18: error: member 'subid_u::detail_t subid_u::detail' with constructor not allowed in union
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 5

你不能像这样初始化成员的成员:你必须有一个构造函数detail并从subid_uctor-initialiser中调用它.

union subid_u
{
    inline subid_u(uint32_t gid, uint32_t sid) : detail(gid, sid) {}

    struct detail_t
    {
        detail_t(uint32_t gid, uint32_t sid) : gid(gid), sid(sid) {}
        uint32_t gid;
        uint32_t sid;
    };

    detail_t    detail;
    uint64_t    subscriptionID;
};
Run Code Online (Sandbox Code Playgroud)

所以你试过了,得到了第二个错误.是的,复杂的对象在联合中是没有意义的.

取而代之的初始化,使用分配的(和我从来没有通常建议这个!)

union subid_u
{
    inline subid_u(uint32_t gid_, uint32_t sid_) {
        detail.gid = gid_;
        detail.sid = sid_;
    }

    struct detail_t
    {
        uint32_t gid;
        uint32_t sid;
    };

    detail_t    detail;
    uint64_t    subscriptionID;
};
Run Code Online (Sandbox Code Playgroud)

问题解决了...?

在C++ 0x中,您将能够执行此操作:

union subid_u
{
    inline subid_u(uint32_t gid, uint32_t sid) : detail{gid, sid} {}

    struct detail_t
    {
        uint32_t gid;
        uint32_t sid;
    };

    detail_t    detail;
    uint64_t    subscriptionID;
};
Run Code Online (Sandbox Code Playgroud)