我创建了一个包含 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/