template <typename T>
struct A {
    struct B {
    };
};

struct C {
    typedef A<C> D;

    int f() {
        typename D::B p;
        return 0;
    }
};

C gc;
int x = gc.f();

template <>
struct A<C> {
    struct B {
        B() {
            cout << "B::B()" << endl;
        }

        ~B() {
            cout << "B::~B()" << endl;
        }
    };
};

int main() {
}
