我创建了一个包含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)
你不能像这样初始化成员的成员:你必须有一个构造函数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)
| 归档时间: |
|
| 查看次数: |
2545 次 |
| 最近记录: |