1 // { dg-do assemble } 2 // GROUPS passed templates 3 4 template<class T> 5 class Vector 6 { 7 int sz; 8 T *v; 9 public: Vector(int s)10 Vector (int s) : sz (s) { v = new T[sz]; } ~Vector()11 ~Vector () { delete[] v; } 12 T &operator[] (int i) { return v[i]; } size()13 int size () { return sz; } 14 }; 15 16 template<class T>// { dg-message "" } previous definition of T 17 struct Comparator 18 { 19 typedef T T;// { dg-error "" } use of template type T in typedef to T lessthanComparator20 static int lessthan (T &a, T &b) { return a < b; } 21 }; 22 23 template<class Comp> 24 struct Sort 25 { 26 static void sort (Vector<Comp::T> &);// { dg-error "" } use of bad T 27 }; 28 29 template<class Comp> sort(Vector<Comp::T> & v)30void Sort<Comp>::sort (Vector<Comp::T> &v)// { dg-error "" } use of bad T 31 { 32 int n = v.size (); 33 34 for (int i = 0; i < n - 1; i++) 35 for (int j = n - 1; i < j; j--) 36 if (Comp::lessthan (v[j], v[j - 1])) 37 { 38 typename Comp::T temp = v[j]; 39 v[j] = v[j - 1]; 40 v[j - 1] = temp; 41 } 42 } 43 44 void f(Vector<int> & vi)45f (Vector<int> &vi) 46 { 47 Sort<Comparator<int> >::sort (vi); // { dg-error "'sort' is not a member of 'Sort<Comparator<int> >'" } 48 } 49