Bon, finalement cet exemple m'est très instructif. Je me rend compte qu'il y a plusieurs choses que je n'avais pas compris, et que je ne comprend toujours pas à l'heure où j'écris ces lignes

(mais ça ne va pas durer

)
Donc oui, je sais bien que toute définition d'une fonction template doit être présente dans son unité de compilation. En fait, dans le code qui m'a posé problème (et qui est vraiment gros, c'est pourquoi je ne l'ai pas posté ici), j'inclus le .cpp à la fin du .h.
Sinon, le premier exemple que tu donnes (celui dans un seul fichier), koala, compile effectivement. Mais il ne compile plus si je sors l'opérateur de flux de la classe myset (même en ne conservant qu'un seul fichier).
J'ai fais ça:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| template <class T>
class myset
{
//...
friend ostream& operator<<(ostream& ofs, const myset& m); // juste je déclare
//...
};
// et je le défini en dehors (mais dans le même fichier)
template <typename T>
ostream& operator<<(ostream& ofs, const myset<T>& m)
{
copy( m.s.begin(), m.s.end(), ostream_iterator<T>(ofs, "\n"));
return ofs;
} |
Et là c'est la catastrophe, je retombe sur la même erreur que je vous ait décrit dans mon premier post (qui est bien une erreur de link).
Et là, ce que je ne comprend pas c'est:
1/ Pourquoi ça ne compile plus quand je sors ce m@udit operateur?
2/ Je ne comprend pas ce que c'est que cette fonction
friend à l'intérieur même de la classe, comme tu a fais koala. Par curiosité, j'ai enlevé le mot-clé
friend et ça ne compile plus. A quoi sert-il ici?
Partager