Function Template
e.g.
void Print(int *A, const int n)
{
  for (int i=0; i<n; i++)
      cout << A[i] << " ";
  cout << endl;
}

void main()
{
  int a[5] = {1,2,3,4,5};
  float b[3] = {1.2,3.4,5.6};

  Print(a,5);
  Print(b,3);   //illegal ....
}

Solution?
1. Create Print_int, Print_float,.... for each type.
2. use function template.
e.g.
#include<iostream.h>
          // It is not end by ';', T can be change to any name
template<class T>
void Print(T *A, const int n)
{
  for (int i=0; i<n; i++)
      cout << A[i] << " ";
  cout << endl;
}

void main()
{
  int a[5] = {1,2,3,4,5};
  double b[3] = {1.2,3.4,5.6};
  char c[6] = "Hello";

  Print(a,5);
  Print(b,3);   //OK
  Print(c,6);   //OK
}


Class Template

     Similar to function template.  No specific type given for array element type.
     The actual type is given during the declaration of objects.

Declaration 1.
          class CL
          {
          ....
          ....
          int A[10];
          }
Declaration 2.
           //It is not end by ";".  T can be changed to any name
     template<class T>   
     class CL
     {
     ....
     ....
     T A[10];
     }
CL<int> OBJ1;  // A in OBJ1 is an array of 10 int.
CL<char> OBJ2; // A in OBJ2 is an array of 10 char.