Quando uma classe precisa manipular dados de forma independente do tipo, podemos também utilizar o template 
                para transformar uma classe em genérica como pode ser visto abaixo:
            
            Sintaxe 
            
template<typename T> class nome_classe
{
    modificador_acesso: 
        T atributo;
        nome_classe(T par); //construtor
        T metodo(T par); //método
}
            Onde
            template: palavra reservada para declara uma template.
typename: tipo de dado que será passado como argumentos.
T: nome do argumento. Podendo ser qualquer outra letra.
            
                A implementação dos métodos da classe template é feita utilizando o operador (::) seguindo
                a sintaxe abaixo:
            
            Sintaxe: construtor 
            
template<typename T> nome_classe<T>::nome_classe(T arg1, T arg2, ...)
            Sintaxe: método 
            
template<typename T> nome_classe<T>::nome_metodo(T arg1, T arg2, ...)
            Exemplo 2
            
#include <iostream>
using namespace std;
template <typename T> class MinhaClasse 
{
  public:
    T prop1;
    T prop2;
    
    MinhaClasse(T p1, T p2); //construtor "genérico"
    T metodo1( T a1, T a2);  //método "genérico"
};
//construtor
template <typename T> MinhaClasse<T>::MinhaClasse(T a1, T a2)
{
    prop1 = a1;
    prop2 = a2;
}
//método
template <typename T> T MinhaClasse<T>::metodo1( T a1, T a2)
{
    cout << "prop1:" << prop1 << " prop2:" << prop2 << endl;
    cout << "a1:" << a1 << " a2:" << a2 << endl;
    
    return a1*prop1 + a2*prop2;
}
int main()
{
    MinhaClasse <int> _classe(2,2);
    cout << _classe.metodo1(3,3) << endl;
    cout << _classe.metodo1(1.5,1.5);
    return 0;
}
            Saída
            
prop1:2 prop2:2
a1:3 a2:3
12
prop1:2 prop2:2
a1:1 a2:1
4