1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
// { 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 <iostream>
#include <cassert>
// --------------- Array.h && Array.cc ------------------
using namespace std;
const int ArraySize = 12;
template <class Type>
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 <class Type>
ostream& operator<<( ostream& os, Array<Type>& ar )
{
ar.print(os);
return os;
}
template <class Type>
void Array<Type>::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 <class Type>
void Array<Type>::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 Type>
class Array_RC : public Array<Type> {
public:
Array_RC(const Type *ar, int sz);
Type& operator[](int ix);
};
template <class Type>
Array_RC<Type>::Array_RC(const Type *ar, int sz) : Array<Type>(ar, sz) {}
template <class Type>
Type &Array_RC<Type>::operator[](int ix) {
assert(ix >= 0 && ix < size);// { dg-error "" } member .size.*
return ia[ix];// { dg-error "" } member .ia.*
}
// ------------------- Test routine ----------------------
template <class Type>
void try_array( Array<Type> &iA )
{
cout << "try_array: initial array values:\n";
cout << iA << endl;
}
template <class Type>
inline void
try_array( Array_RC<Type> &rc )
{
try_array( ((Array<Type>&)rc) );
}
int main()
{
static int ia[10] = { 12, 7, 14, 9, 128, 17, 6, 3, 27, 5 };
Array_RC<int> iA(ia, 10);
cout << "template Array_RC class" << endl;
try_array(iA);
return 0;
}
template class Array_RC<int>;
|