在C++

2010-06-13 68 views
13

静态初始化匿名联合我试图在Visual Studio 2010中静态初始化以下结构:在C++

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中工作。有任何想法吗?

回答

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); 
+0

谢谢!我把这做成了一个可行的解决方案。 – wpfwannabe 2010-06-14 10:38:37

2

更改为:

struct Data 
{ 
    int x; 
    union 
    { 
     const Data* data; 
     char ch; 
    }; 
}; 

static Data d1; 
static Data d = {1, &d1}; 
+0

事实上这样的作品,但我过于简化我的现实生活中的情况下,所以现在我已经更新了一个更好的代码失败了'd2'问题初始化。 – wpfwannabe 2010-06-13 09:02:20

+0

我想这对新人来说并不明显,为什么这个应该是可行的。我总是给我的答案添加一个小的解释。 – 2010-06-13 09:23:01

24

ISO C++ 03 8.5.1 [dcl.init.aggr]/15:

当联合用括号括起来的初始化初始化,大括号只能包含工会的第一个成员的初始化程序。 [实施例:

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 

末端示例]

所以,一般来说,它不能这样做。

+0

非常感谢!我担心这将是答案。 +1为您投票,但回答给'ChrisW'一个可用的解决方法。 – wpfwannabe 2010-06-14 10:37:54

1

,如果你所有的工会类型的指针,用一个空指针作为联盟的第一个元素可以使这项工作。所有指针都可以转换为void指针,所以你的联合可以用任意指针类型初始化。对于给出的示例,您将获得:

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