1
resposta

Dúvidas sobre herança com classes template

Minha dúvida é na questão do compilador gerar em tempo de compilação códigos distintos da classe, então existiriam duas classes de pessoa para pessoa com cfp e pessoa com rg, por exemplo.
Existiriam então problemas então no uso de algo como

//Na definiçao de Pessoa temos
public:
    std::string comparaNome(Pessoa<Documento> outra) const
    {
        std::string nome = recuperaNome();
        return nome._Equal(outra.recuperaNome());
    }
    
//na main temos

    Pessoa<Cpf> pessoa(Cpf("000.000.000-00"), "José");
    Pessoa<string> outraPessoa("111.111.111-11", "José");
   cout << "E igual :" << pessoa.comparaNome(outraPessoa);

Dando esse erro de compilação
Não há conversão apropriada, que possa ser definida pelo usuário, de "Pessoastd::string" para "Pessoa"

O que parece quebrar a ideia de herança da orientação a objetos, dado que teoricamente é a mesma classe

1 resposta

Olá Samuel! Como vai?

O que está acontecendo no seu caso é que, ao usar templates, o compilador gera classes distintas para cada tipo de template que você utiliza. No seu exemplo, Pessoa<Cpf> e Pessoa<std::string> são consideradas classes diferentes, mesmo que compartilhem a mesma estrutura base de código.

O erro que você está enfrentando ocorre porque não há uma conversão implícita entre essas duas instâncias de template. Quando você tenta passar outraPessoa do tipo Pessoa<std::string> para a função comparaNome que espera um Pessoa<Cpf>, o compilador não consegue encontrar uma maneira de realizar essa conversão automaticamente.

Para resolver esse problema, você pode considerar algumas abordagens:

  1. Generalizar a Função: Você pode modificar a função comparaNome para aceitar qualquer tipo de Pessoa, desde que o tipo de documento não importe para a comparação de nomes. Isso pode ser feito usando templates na própria função:

    template<typename OutroDocumento>
    std::string comparaNome(const Pessoa<OutroDocumento>& outra) const
    {
        std::string nome = recuperaNome();
        return nome._Equal(outra.recuperaNome());
    }
    
  2. Utilizar uma Classe Base Comum: Se Documento for uma classe base comum para Cpf e std::string, você pode criar uma função que aceite Pessoa<Documento> e trabalhe com métodos comuns a todos os tipos de documentos.

  3. Polimorfismo: Se possível, use herança e polimorfismo para criar uma interface comum para todos os tipos de Pessoa, mas isso pode não ser aplicável se o tipo de documento é crucial para a lógica de cada instância.

Essas são algumas sugestões que podem ajudar a resolver seu problema.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.