[Resolvido] problema ao sobrecarregar uma funcao global com uma template de funcao
7 respostas
DavidUser
tive problemas ao tentar a seguinte sobrecarga de função:
template<typenameT,intnumberOfElements>//operadordeentradasobrecarregadoparaaclasseArray;//entradadevaloresparaoArrayistream&operator>>(istream&input,Array<T,numberOfElements>&a){for(inti=0;i<a.size;i++)input>>a.ptr[i];returninput;//permitecin>>x>>y;}//fimdafun��otemplate<typenameT,intnumberOfElements>//operadordesa�da sobrecarregado para classe Arrayostream&operator<<(ostream&output,constArray<T,numberOfElements>&a){inti;//gerasa�da do array baseado em ptr privatefor(i=0;i<a.size;i++){output<<setw(12)<<a.ptr[i];if((i+1)%4==0)//4n�meros por linha de sa�daoutput<<endl;}//fimdoforif(i%4!=0)//terminaa�ltima linha de sa�daoutput<<endl;returnoutput;//permitecout<<x<<y;}//fimdafun��o operator<<
queria entender se o meu pensamento está correto e gostaria se alguém me explicasse melhor, uma função que foi sobrecarregada dá prioridade as funções não-template então os operadores padrão do c++ "<<" e ">>" tem funções não-template que já possui um argumento do tipo do meu objeto?
Ao tentar a sobrecarga tudo segue normalmente mas ao utilizar o operador a sobrecarga não tem efeito.
Não sei o que pode ter dado de errado no seu código, porque você não postou tudo. O que pude reproduzir a partir do seu código parece ter funcionado direitinho.
DavidUser
no meu código as funções são friends da classe.
e invés de pegar o tamanho direto do parâmetro do template de função pega o size da matriz direto no atributo privado e percorro o array direto do ponteiro privado.
istream&operator>>(istream&input,Array<T,numberOfElements>&a)
{
for(inti=0; i < a.size; i++ )input>>a.ptr[i];
minha classe array tem o ponteiro e o atributo size privados:
Você não declarou corretamente o friend operator. A declaração correta (que compila corretamente com o g++ 4.3 e com o MS Visual Studio 2008) é algo como (novamente usando meu exemplo):
Note que o g++ não aceita que eu conserve o mesmo nome para o parâmetro do template (tive de usar U e m).
DavidUser
Muito Obrigado entanglement estou lendo o Deitel onde não havia um exemplo para essa situação, mas creio que então que template <typename U, int m> faz parte do cabeçalho da função e como a declaração friend na classe depende de um protótipo de função…
Entendi certo? Quando declaro uma template de função o cabeçalho de template também faz parte do cabeçalho de função?
[size=18]
Entendi certo? Quando declaro uma template de função o cabeçalho de template também faz parte do cabeçalho de função?[/size]
E
entanglement
De certo modo sim.
Realmente você teria dificuldade de achar um exemplo desses no Deitel, já que ele expõe uma sutileza da linguagem que nem é muito bem implementada em todos os compiladores.
Se você tem intimidade com leitura de especificações de linguagens de programação (é algo semelhante a ler um livro de Direito Tributário e de matemática avançada ao mesmo tempo, já que tem um monte de coisas arbitrárias e que não fazem sentido à primeira vista), então pode tentar achar isso na definição da linguagem C++. Talvez você possa encontrar isso mais ou menos explicado em: http://www2.research.att.com/~bs/arm.html - este é o livro carinhosamente chamado de “ARM” pela comunidade C++.
Para ver como você quer usar um caso pouco usado da linguagem (operadores “friend” em um template), basta ver que o código que postei não compila corretamente no Visual Studio 2005 ( o código que compila no 2005 não compila no g++ 4.3, nem no 2008, e vice-versa ).
Um conselho: se puder, evite usar recursos da linguagem C++ que possam ter problemas de compilação. Eu tenho os 3 compiladores na minha máquina, e foi por isso que consegui ver que isso é algo difícil de usar.
DavidUser
Muito Obrigado pela ajuda e atenção entanglement!
Vou procurar este livro