// { dg-do assemble } // GROUPS passed visibility // visibility file // From: dinh@cs.ucla.edu (Dinh Le) // Date: Mon, 12 Jul 93 22:21:06 -0700 // Subject: class, template and their scoping problem // Message-ID: <9307130521.AA18312@oahu.cs.ucla.edu> #include #include // --------------- Array.h && Array.cc ------------------ using namespace std; const int ArraySize = 12; template class Array { // { dg-error "" } .struct Array_RC redecl.* friend class Array_RC; public: Array(const Type *ar, int sz) { init(ar,sz); } virtual ~Array() { delete [] ia; } virtual void print(ostream& = cout); virtual Type& operator[](int ix) { return ia[ix]; } private: void init(const Type*, int); int size; int *ia; }; template ostream& operator<<( ostream& os, Array& ar ) { ar.print(os); return os; } template void Array::print(ostream& os) { const int lineLength = 12; os << "( " << size << " )< "; for (int ix = 0; ix < size; ++ix) { if (ix % lineLength == 0 && ix) os << "\n\t"; os << ia[ ix ]; if (ix % lineLength != lineLength-1 && ix != size-1) os << ", "; } os << " >\n"; } template void Array::init(const Type *array, int sz) { ia = new Type[size = sz]; for (int ix = 0; ix < size; ++ix) ia[ix] = (array!=0) ? array[ix] : (Type)0; } // --------------- Array_RC.h && Array_RC.cc ---------------- template class Array_RC : public Array { public: Array_RC(const Type *ar, int sz); Type& operator[](int ix); }; template Array_RC::Array_RC(const Type *ar, int sz) : Array(ar, sz) {} template Type &Array_RC::operator[](int ix) { assert(ix >= 0 && ix < size);// { dg-error "" } member .size.* return ia[ix];// { dg-error "" } member .ia.* } // ------------------- Test routine ---------------------- template void try_array( Array &iA ) { cout << "try_array: initial array values:\n"; cout << iA << endl; } template inline void try_array( Array_RC &rc ) { try_array( ((Array&)rc) ); } int main() { static int ia[10] = { 12, 7, 14, 9, 128, 17, 6, 3, 27, 5 }; Array_RC iA(ia, 10); cout << "template Array_RC class" << endl; try_array(iA); return 0; } template class Array_RC;