Bonjour

Dernièrement j'ai eu un problème en compilant un projet sous VC7 pour la première fois. Dans les classes templates, les opérateurs définis en tant que fonctions amies de la classe faisaient tous l'objet d'une erreur à l'édition des liens (fonction non définie). Un peu comme si j'avais mis les fonctions template dans un .cpp, alors qu'elles étaient bien dans le .h (et que ça avait toujours marché sous VC6). Ces fonctions (que ce soit des opérateurs ou des fonctions classiques ne changeait rien) se présentaient comme suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
template <class T>
class A
{
public:
   friend void func(A<T>&);
};
 
template <class T>
void func(A<T>& a)
{ /* du code */ }
Après pas mal d'heure de prise de tête, je me rend enfin compte qu'il y a un moyen de faire enfin avaler à VC7 ces fonctions. Il fallait les présenter plutôt comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
template <class T>
class A
{
public:
   friend void func(A<T>& a)
   { /* du code */ };
};

Bon ça semble très bien comme solution seulement je trouve que ce n'est pas très pratique pour des fonctions dont le corps serait un peu imposant. C'est une présentation à la Java, présentation que je n'aime justement pas. J'ai donc 2 questions :
- pourquoi VC7 exige cette façon de présenter le code alors que VC6 se débrouillait très bien avec la première méthode ?
- n'y a-t-il vraiment aucun moyen de séparer la déclaration de la définition pour des fonctions friend+template, sous VC7 ?

Merci d'avance