#include <iostream>
using namespace std;
struct A {
//protected:
struct C { static void f() { cout << "A::C::f" <<endl; } };
};
struct B: A {
C c1; // the only C known here is A::C
struct C { static void f() { cout << "B::C::f" <<endl; }};
C c2; // but here the closes C known is B::C
A::C c3; // and here I can be explicit about the C I want
using D=A::C; // and here another way to be explicit:
D c4;
};
int main() {
B::C x;
B::A::C y;
A a = B();
decltype(a)::C::f();
B b;
decltype(b.c1)::C::f();
decltype(b.c2)::C::f();
decltype(b.c3)::C::f();
decltype(b.c4)::C::f();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpzdHJ1Y3QgQSB7CgogICAgLy9wcm90ZWN0ZWQ6CgogICAgc3RydWN0IEMgeyBzdGF0aWMgdm9pZCBmKCkgeyBjb3V0IDw8ICJBOjpDOjpmIiA8PGVuZGw7IH0gfTsKCn07CgpzdHJ1Y3QgQjogQSB7CiAgICBDIGMxOyAgICAgICAgICAgIC8vIHRoZSBvbmx5IEMga25vd24gaGVyZSBpcyBBOjpDCiAgICBzdHJ1Y3QgQyB7IHN0YXRpYyB2b2lkIGYoKSB7IGNvdXQgPDwgIkI6OkM6OmYiIDw8ZW5kbDsgfX07CiAgICBDIGMyOyAgICAgICAgICAgIC8vIGJ1dCBoZXJlIHRoZSBjbG9zZXMgQyBrbm93biBpcyBCOjpDCiAgICBBOjpDIGMzOyAgICAgICAgIC8vIGFuZCBoZXJlIEkgY2FuIGJlIGV4cGxpY2l0IGFib3V0IHRoZSBDIEkgd2FudAogICAgdXNpbmcgRD1BOjpDOyAgICAvLyBhbmQgaGVyZSBhbm90aGVyIHdheSB0byBiZSBleHBsaWNpdDoKICAgIEQgYzQ7IAp9OwoKaW50IG1haW4oKSB7CglCOjpDIHg7CglCOjpBOjpDIHk7CglBIGEgPSAgQigpOwogICAgZGVjbHR5cGUoYSk6OkM6OmYoKTsKICAgIAogICAgQiAgYjsgCiAgICBkZWNsdHlwZShiLmMxKTo6Qzo6ZigpOwogICAgZGVjbHR5cGUoYi5jMik6OkM6OmYoKTsKICAgIGRlY2x0eXBlKGIuYzMpOjpDOjpmKCk7CiAgICBkZWNsdHlwZShiLmM0KTo6Qzo6ZigpOwoJcmV0dXJuIDA7Cn0=