template class C; template struct B; template , typename = C > class D; template , typename = C > class E; template class C { }; template struct H { struct I { void fn1 (G __a) { fn2 (__a); } void fn2 (G) throw (); }; I *fn3 () {} H (); ~H () { fn3 ()->fn1 (fn4 ()); } G fn4 () {} }; struct J { static int j1; static int j2; }; template struct K { virtual ~ K () {} }; template struct L { void fn5 (K *); }; template struct D : public K { H d; D (int = J::j1) : K (), d () {} }; template struct E : public L { D e; E (int = J::j2) : L (), e () { fn5 (&e); } }; extern template class D ; template class M; template L &operator<<(L &, const M <_Tp> &) { E e; } template L > &operator<<(L >&, const M &);