Class Templates - Example 10-10 - Template function with a user defined type

// File: ex10-10.cpp

#include <iostream>
#include <cstdlib>
using namespace std;

template <typename T>
class array
{
  private:
	  T* ptrT;
	  int size;
  public:
	  array(): ptrT(0), size(0) {}
	  array(int);
	  T& operator[](int);
};

template <typename T>
array<T>::array(int n)
{
	size = n;
	ptrT = new T[n];
	for (int i = 0; i < size; i++) ptrT[i] = 0;
}

template <typename T>
T& array<T>::operator[](int index)
{
	if (index < 0 || index >= size)
	{
		cerr << "invalid array index\n";
		return *ptrT;
	}
	else return ptrT[index];
}

class fraction
{
private:
	int numer, denom;
public:
	fraction() {}
	fraction(int z) : numer(z), denom(0) {}
	fraction(int n, int d) : numer(n), denom(d) {}
	friend ostream& operator<<(ostream&, const fraction&);
};

ostream& operator<<(ostream& s, const fraction& f)
{
	return s << f.numer << '/' << f.denom;
}

int main(void)
{
	int i;  
	array<int> a1(3);
	for (i = 0; i < 3; i++) a1[i] = (2 * i);
	for (i = 0; i < 3; i++) cout << a1[i] << endl;

	array<float> a2(3);
	for (i = 0; i < 3; i++) a2[i] = (2.7 * i);
	for (i = 0; i < 3; i++) cout << a2[i] << endl;

	array<char> a3(6);
	for (i = 0; i < 3; i++) a3[i] = 65+3*i;
	for (i = 0; i < 3; i++) cout << a3[i] << endl;

	array<fraction> a4(3);
	a4[0] = fraction(3,4);
	a4[1] = fraction(1,2);
	a4[2] = fraction(5,8);
	for (i = 0; i < 3; i++) cout << a4[i] << endl;

	return 0;
}

/***** Output *****
0
2
4
0
2.7
5.4
A
D
G
3/4
1/2
5/8
*********************/