Я пытаюсь статически инициализировать следующую структуру в 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. Какие-либо идеи?
Можете ли вы сделать это, определив перегруженных конструкторов? Непроверенный код впереди:
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);
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"}; // ошибка
- конец примера]
Так что, вообще говоря, это невозможно.
Изменить на:
struct Data
{
int x;
union
{
const Data* data;
char ch;
};
};
static Data d1;
static Data d = {1, &d1};