c++ - 在 union 中构建结构

标签 c++ struct unions

我创建了一个包含 uint64_t 和结构的 union 。我希望 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

最佳答案

你不能像那样初始化成员的成员:你必须在 detail 中有一个构造函数并从 subid_u 的 ctor-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;
};

所以你尝试了那个,并得到了你的第二个错误。是的,一个复杂的对象并集是没有意义的。

使用赋值代替初始化(我从不通常推荐这样做!)

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;
};

问题解决了...?

在 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;
};

关于c++ - 在 union 中构建结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5497987/

相关文章:

c++ - 在 C++ 中实现一个通用的双链表

c++ - 引用基类的成员 var 导致访问冲突

c++ - 在成员初始化器列表中,我可以创建对不在列表中的成员变量的引用吗?

c++ - 加载 HBITMAP 并将其转换为 OpenGL 纹理

同一接口(interface)的多个版本的 C++ 设计(头文件中的枚举/结构)

c++ - 使用指定的初始化器聚合匿名结构的初始化

c++ - 访问结构的 union 成员的优雅方式

C - 丢失 pointee 结构值

c++ - C++中带有模板变量的结构

c - 对 union 中的字符进行 strcpy 时程序中止