Merci de ta prompte réponse !
J'avais déjà pensé à cette syntaxe mais ça ne marche pas :
Avec ce code :
template <typename Value> class foo
{
public:
template <typename output>
friend output & operator<< ( output & o , const foo & t ) ;
private:
Value i ;
} ;
template <typename Value,typename output>
output & operator<< ( output & o , const foo<Value> & t )
{
o << t.i ; // ERREUR : ne peut accéder à un membre privé
return( o ) ;
}
le compilo me renvoie l'erreur en rouge au dessus.
Tout s'explique avec cette tentative :
template <typename Value> class foo
{
public:
template <typename output>
friend output & operator<< ( output & o , const foo & t )
{ // implémentée ici
o << t.i ;
return( o ) ;
}
private:
Value i ;
} ;
template <typename Value,typename output>
output & operator<< ( output & o , const foo<Value> & t )
{ // et encore une fois ici --> on devrait avoir une erreur !
o << t.i ;
return( o ) ;
}
J'ai toujours la même erreur alors que je m'attendais à ce que le compilo me dise que l'opérateur << était déjà implementé. J'en conclue qu'il ne fait pas le lien entre la déclaration de la fonction amie au sein de la classe et celle implémentée plus bas. Ce qui explique l'erreur : il ne sait pas que cette fonction est celle qui avait désignée comme amie et du coup, interdit l'accès aux membres privés.
Ce qui est encore plus bizarre, c'est que si, dans la première version du code, on vire le "private", ça marche et l'operateur << est bien invoqué. Ce qui signifie que dans ce cas là, le compilo sait bien aller chercher cette fonction.
Il faudrait essayer avec gcc pour voir si c'est un pb d'implementation de la norme c++ par Crimosoft...
Hadrien