#define N 12
const int n = 10;
int i = 23;

template <class T, int nElementos>
class Tabla {
  public:
   Tabla();
   ~Tabla();
   T& operator[](int indice) { return pT[indice]; }

  private:
   T *pT;
};

// Definición:
template <class T, int nElementos>
Tabla<T,nElementos>::Tabla() {
   pT = new T[nElementos];
}

template <class T, int nElementos>
Tabla<T, nElementos>::~Tabla() {
   delete[] pT;
}

main(){
  Tabla<int,32>   TablaInt;   // Tabla de 32 enteros
  Tabla<float,12> TablaFloat; // Tabla de 12 floats
  Tabla<bool,10>  TablaBool;  // Tabla de 10 bools

  Tabla<int,N>     TablaInt2;   // Legal, Tabla de 12 enteros
  Tabla<float,3*n> TablaFloat2; // Legal, Tabla de 30 floats
  Tabla<char,i>    TablaChar; // Ilegal
}
