13

我正在尝试在 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 中工作。有任何想法吗?

4

4 回答 4

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

——结束示例]

所以,一般来说,是做不到的。

于 2010-06-13T09:03:03.657 回答
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); 
于 2010-06-13T09:19:56.600 回答
3

将其更改为:

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

static Data d1;
static Data d = {1, &d1};
于 2010-06-13T08:48:04.437 回答
1

如果所有联合类型都是指针,则可以通过使用 void 指针作为联合的第一个元素来完成这项工作。所有指针都可以转换为 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}}
于 2011-03-25T16:29:36.997 回答