我试图在Visual Studio 2010中静态初始化以下结构:
struct Data
{
int x;
union
{
const Data* data;
struct {int x; int y; };
};
};
以下内容因error C2440: 'initializing' : cannot convert from 'Data *' to 'char'
而失败。
static Data d1;
static Data d = {1, &d1};
static Data d2 = {1, {1, 2}};
我已经找到了一些可以正确初始化的方法的引用,但它们都不能在VS2010中工作。有什么想法吗?
答案 0 :(得分:24)
ISO C ++ 03 8.5.1 [dcl.init.aggr] / 15:
当用括号括起的初始化程序初始化union时,大括号只包含联合的第一个成员的初始化程序。 [实施例:
union u { int a; char* b; }; u a = { 1 }; u b = a; u c = 1; // error u d = { 0, "asdf" }; // error u e = { "asdf" }; // error
-end example]
所以,一般来说,它无法完成。
答案 1 :(得分:5)
你能通过定义重载的构造函数来实现吗?未经测试的代码:
struct Data
{
int x;
union
{
const Data* data;
struct {int a; int b; } z;
} y;
Data()
{
x = 0;
y.data = 0;
y.z.a = 0;
y.z.b = 0;
}
Data(int x_, Data* data_)
{
x = x_;
y.data = data_;
}
Data(int x_, int a_, int b_)
{
x = x_;
y.z.a = a_;
y.z.b = b_;
}
};
static Data d1;
static Data d(1, &d1);
static Data d2(1, 1, 2);
答案 2 :(得分:2)
将其更改为:
struct Data
{
int x;
union
{
const Data* data;
char ch;
};
};
static Data d1;
static Data d = {1, &d1};
答案 3 :(得分:1)
如果所有联合类型都是指针,则可以通过使用void指针作为联合的第一个元素来使其工作。所有指针都可以转换为void指针,因此可以使用任意指针类型初始化union。对于给定的示例,您将获得:
struct Data
{
int x;
union
{
const void* unused;
const Data* data;
struct {int x; int y; }*; //Not sure this works written like this
const char* asChar;
const int* asInt;
};
};
static Data d1;
static Data d2 = {2, &d1};
static Data d3 = {1, "Hello, world!"};
另一种可能性是用C代替。在C中,您可以指定联合的哪个部分已初始化。使用原始结构(并将结构命名为asStruct):
static Data d1;
static Data d2 = {2, &d1};
static Data d3 = {3, {.asStruct = {0,0}}