Pytanie podstawowe to czy potrafisz powiedzieć z czym masz do czynienia? To deklaracja klasy czy jej definicja? Tu na razie widać ze masz coś takiego:
Deklarację struktury X zawierającej dwie deklaracje struktur wewnętrznych y i z.
Jak chcesz teraz z takiej definicji 2 struktur wewnętrznych mieć 2 atrybuty, to je zdefiniuj. Wtedy będziesz je mógł inicjować.
#include <iostream>
struct X
{
struct y
{
int a;
};
struct z
{
int b;
};
struct y m1;
struct z m2;
};
int main() {
// a = 12, b = 33
X x{{12}, {33}};
std::cout << "x.m1.a == " << x.m1.a << "\tx.m2.b == " << x.m2.b << '\n';
}
Jeśli jednak nie chcesz tak, to widać chcesz mieć "wyciągnięte" typy wewnętrzne. A to proszę...
#include <iostream>
struct X
{
struct y
{
int a;
};
struct z
{
int b;
};
};
int main() {
// a = 12, b = 33
auto obj_y = X::y{12};
auto obj_z = X::z{33};
std::cout << "obj_y.a == " << obj_y.a << "\tobj_z.b == " << obj_z.b << '\n';
}
Tu masz po prostu "zbitkę typów" pod nazwą X.