1 // { dg-do compile } 2 3 // Copyright (C) 2004 Free Software Foundation 4 // Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> 5 6 // Nested class template of class template as friend 7 8 template<class T> struct A 9 { 10 template <T t> struct B 11 { 12 void f(); 13 }; 14 }; 15 16 template <class U> class C { 17 int i; 18 template<class T> template <T t> friend struct A<T>::B; 19 }; 20 21 template<class T> struct A<T*> 22 { 23 template <T* t> struct B 24 { 25 void f(); 26 }; 27 }; 28 29 template<> struct A<char> 30 { 31 template <char t> struct B 32 { 33 void f(); 34 }; 35 }; 36 37 template<class T> template <T t> void A<T>::B<t>::f() 38 { 39 C<int> c; 40 c.i = 0; 41 } 42 43 template<class T> template <T* t> void A<T*>::B<t>::f() 44 { 45 C<int> c; 46 c.i = 0; 47 } 48 49 template <char t> void A<char>::B<t>::f() 50 { 51 C<int> c; 52 c.i = 0; 53 } 54 55 template <> void A<char>::B<'b'>::f() 56 { 57 C<int> c; 58 c.i = 0; 59 } 60 61 int d2 = 0; 62 63 int main() 64 { 65 A<int>::B<0> b1; 66 b1.f(); 67 A<int *>::B<&d2> b2; 68 b2.f(); 69 A<char>::B<'a'> b3; 70 b3.f(); 71 A<char>::B<'b'> b4; 72 b4.f(); 73 } 74