Exercícios Resolvidos de Templates

Ver Teoria

Enunciado

Estude o seguinte código

Existe um o erro produzido pelo terceiro c o u t .

  1. Explique o motivo deste erro.
  2. Corrija o erro sem alterar o conteúdo entre parêntesis.

Passo 1

E aí galerinha. Vamos pra mais um exercício maneiro.

  1. Explique o motivo deste erro.
  2. Esse é um daqueles exercício em que o código tem um erro. Esse é um erro um tanto difícil de encontrar apenas olhando, mas pra nossa sorte a questão já informou que o erro está no terceiro c o u t , o da linha 14.

    O erro é sutil, e pra entender a gente precisar olhar antes pra definição de template nas linhas 04 e 05

    Olha só, na declaração da função-template definimos os dois parâmetros x e y usando o mesmo tipo genérico T .

    Agora vamos olhar pra linha 14, que é onde o compilador avisa do erro. Nessa linha, a gente entrega pra função dois parâmetros de tipos diferentes. O 3 é um inteiro, e o 7.0 é um f l o a t .

    Quando o compilador tentar rodar essa linha ele vai ficar doidinho. Pois ele não vai saber se o tipo genérico T deve ser considerado como i n t , ou se deve ser considerado como f l o a t .

    Se você tentar rodar esse código, o seu compilador vai informar um erro parecido com esse:

    Que basicamente está dizendo “não existe um template chamado M a x em que os parâmetros possam ter tipos diferentes!”

    Passo 2

  3. Corrija o erro sem alterar o conteúdo entre parêntesis.

Belezinha. Identificamos o erro, e já explicamos o motivo de ele acontecer. Mas como corrigimos isso?

Uma forma de corrigir o erro seria trocando o valor entre parêntesis, para que os dois valores sejam do mesmo tipo. Porém a questão falou que a gente não pode fazer isso.

A forma mais fácil de corrigir esse erro é forçando que o valor de T assuma um tipo predeterminado. Pra fazer isso, a gente pode colocar o tipo que queremos definir dentro de chaves <   > logo depois do nome da função e antes dos parêntesis:

N o m e F u n c a o T e m p l a t e < t i p o > ( p a r a m e t r o s )

Então, pra corrigir o código, é só a gente ir na linha 14 e forçar que a função template utilize um tipo específico. Para garantir maior precisão, vou forçar o uso do tipo f l o a t

Passo 2

Agora o código está corrigido! Mas pra garantir, vamos colocar o código pra rodar e ver o resultado:

E aí está. Tudo rodando certinho!

Até a próxima questão, galera!

Resposta

Ei, a resposta está no passo a passo :)