Joel F a écrit :
si tu mets T dans ton friend, il ne va generer un friend que pr l'instance de operator<< avec effectivement T en type specialisé. Ici il faut lui dire que ton friend est une template avec un parametre idpt de T.
Apres je te dirais que friend pour operator<< est inutile. Une fonction libre est suffisante.
|
J'approuve, mais deux tuyaux au passage :
- sous certains compilo, le matching entre une free function et son argument template coince, en particulier visual .net qui est encore TRES utilisé. Si l'operator<< est le seul dans le scope, ça passe, mais s'il y en a un autre, même avec une signature complètement différente, il déraille et dit qu'il ne trouve pas ou qu'il y a ambiguité. Curieusement, déclarée en friend, l'operateur est trouvé, un peu comme un Koening's lookup. Attention c'est juste une astuce pour VC, pas une bonne règle générale.
- Quand tu es dans une classe template< typename T > stack<T>, ton type peut s'appeler stack, pas besoin de préciser stack<T>, ça rend les template un peu moins lourds.
- En définissant ta friend fonction directement dans le corps de la classe, ça serait surement passé. Les compilo on du mal avec les membres templates de template ou les template friend pour matcher la déclaration et la définition. Là comme de toute façon t'es dans un template, inline ou pas ça change pas l'organisation du code.