代码之家  ›  专栏  ›  技术社区  ›  wpfwannabe

在C++中静态初始化匿名联盟

  •  13
  • wpfwannabe  · 技术社区  · 14 年前

    我正在尝试在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 回复  |  直到 12 年前
        1
  •  5
  •   ChrisW    14 年前

    你能通过定义重载的构造函数来实现吗?前方未测试代码:

    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
  •  24
  •   Pavel Minaev    14 年前

    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
    

    “结束示例”]

    所以,一般来说,这是不可能的。

        3
  •  2
  •   Paul R    14 年前

    把它改成:

    struct Data
    {
       int x;
       union
       {
          const Data* data;
          char ch;
       };
    };
    
    static Data d1;
    static Data d = {1, &d1};
    
        4
  •  1
  •   Jerome    14 年前

    如果所有联合类型都是指针,则可以使用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}}