Fonctions template+friend sous VC7
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:
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:
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
Re: Fonctions template+friend sous VC7
Citation:
Envoyé par patapetz
Code:
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 */ } |
Un extrait de la norme (14.5.3) :
Code:
1 2 3 4 5 6
|
template<class T> class task {
// ...
friend void process(task<T>*);
// ...
}; |
[...]
because process does not have explicit template arguments, each specialization of the task class template has an appropriately typed function process as a friend, and this friend is not a function template specialization;
Je ne suis pas du tout certain de ce que ça veut dire, mais il semble que ce serait un indice que ton code initial est incorrect, et qu'il faudrait le remplacer par :
Code:
1 2 3 4 5 6 7 8 9 10
| template <class T>
class A
{
public:
friend void func<T>(A<T>&);
};
template <class T>
void func(A<T>& a)
{ /* du code */ } |