Статически инициализируйте анонимное объединение в C++

Я пытаюсь статически инициализировать следующую структуру в 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. Какие-либо идеи?

13
задан timrau 8 October 2012 в 15:39
поделиться

3 ответа

Можете ли вы сделать это, определив перегруженных конструкторов? Непроверенный код впереди:

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); 
5
ответ дан 1 December 2019 в 19:58
поделиться

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

Когда объединение инициализируется с помощью инициализатора, заключенного в фигурные скобки, фигурные скобки должны только содержат инициализатор для первого члена объединения . [Пример:

 объединение u {int a; char * b; };
u a = {1};
u b = a;
u c = 1; // ошибка
u d = {0, "asdf"}; // ошибка
u e = {"asdf"}; // ошибка

- конец примера]

Так что, вообще говоря, это невозможно.

24
ответ дан 1 December 2019 в 19:58
поделиться

Изменить на:

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

static Data d1;
static Data d = {1, &d1};
2
ответ дан 1 December 2019 в 19:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: