Considere as seguintes definições de templates das funções , e .
E considere as classes , e
Indique quais das linhas de código de abaixo são legais e explique as que não são.
Passo 1
E aí, pessoal?!
Essa é uma questão trabalhosa, mas que vamos fazer com calma e vai dar tudo certo. A chave da questão é perceber como cada um dos tipos genéricos vai se comportar quando uma função é chamada.
Vamos começar analisando os templates.
Vamos começar observando as classes , e
As três classes são bem similares, e consistem em apenas três atributos inteiros.
São classes sem função real, e tudo que importa pra essa questão é que elas representam tipos diferentes!
Agora vamos analisar as aparições dessas classes na (). Logo no início são declarados um objeto de cada uma das classes: do tipo , do tipo e do tipo .
Passo 2
Vamos analisar o template
O template de função usa apenas um tipo genérico chamado . Ele recebe dois valores do mesmo tipo e retorna como resultado o segundo valor. Ou seja, recebe e retorna valores todos do mesmo tipo!
Agora vamos analisar as aparições da função dentro da .
Esse template de função deve receber dois argumentos e um retorno do mesmo tipo. Então caso haja alguma diferença de tipo, haverá um erro.
Então podemos apontar um erro na linha 08 onde o retorno é diferente do tipo do argumento .
E um outro erro na linha 09 onde os três tipos envolvidos são diferentes.
Passo 3
Em seguida, vamos analisar .
O template de função utiliza dois tipos genéricos e . Essa função recebe dois valores, um de cada tipo, e retorna o segundo valor recebido. O importante é que na função o retorno é do mesmo tipo que o segundo argumento.
Agora vamos ver dentro da
Aqui o importante é que o tipo do retorno seja igual ao tipo do segundo argumento.
E por isso temos um erro na linha 13 onde os tipos e são diferentes.
E na linha 15 onde e são de tipos diferentes.
Passo 4
E por fim, a o template de função .
O template de função utiliza três tipos genéricos , e . Os valores recebidos são de tipos diferentes e antes de retornar, a função converte o tipo de para . Ou seja, a função pode receber dois argumentos de tipos diferentes, e retornar um valor de um terceiro tipo.
Porém, tem um detalhe. O prefixo de declara três tipos genéricos , e . O tipo real de será definido quando for passado o primeiro argumento . O tipo de será definido de acordo com o segundo argumento . Mas em que momento o tipo real de está sendo definido?
O tipo de não é definido em nenhum momento! Então para usar esse template, a única forma é definindo os tipos de , e de forma explicita usando as chaves:
Em nenhum momento o tipo verdadeiro de está sendo definido de forma explicita! Então todos os usos de mostrados no código estão errados.
Passo 5
Para corrigir esse código, primeiro vamos precisar remover as linhas 08 e 09
Depois, devemos remover as linhas 13 e 15.
E nas linhas 19 a 22 devemos adicionar explicitamente os tipos que estão sendo usados no template:
E é isso pessoal! Até a próxima!