 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
marc.boyer@enseeiht.yahoo Guest
|
Posted: Wed Mar 09, 2005 12:02 pm Post subject: Template, conversion implicite, fonction amie |
|
|
Bnojour à tous,
je reprenais un code qui fonctionnait avec un vieux gcc, et ne
fonctionne plus.
L'idée: soit une classe template Num<T> qui offre une convertion
implicite de T -> Num<T>, et qui offre une fonction membre operator+=.
J'aimerais batir une fonction operator+ qui se base sur operator+=
mais accepte les conversions implices (qu'on puisse faire T + Num<T>
ou Num<T> + T ).
Quand j'ai demandé comme faire, il y a longtemps, on m'a expliqué
qu'il n'y
avait pas de conversion implicite vers les fonctions templates, mais
qu'on
pouvait faire une fonction amie d'une classe template.
template <class T>
class Num {
Num<T>(const T){...}:
const Num<T>& operator+=(const Num<T>& incr){...}
friend Num<T> operator+(const Num<T>& l, const Num<T>& r);
};
Tout va bien (et gcc me préviens que je fais une fonction amie non
template),
jusqu'à ce que je doive définir la dite fonction.
J'écris
template <class T>
inline Num<T> operator+(const Num<T>& l, const Num<T>& r){
Num<T> tmp(l);
return tmp+= r;
}
Cela compile, mais au moment de l'édition de lien, il se plaind d'une
undefined reference to operator+(Num<int>const &, Num<int>const &);
J'ai relu mon TC++PL, mais je n'ai pas su y trouver quoi que ce soit
qui m'aide là.
Merci d'avance,
Marc Boyer
|
|
| Back to top |
|
 |
Laurent Guest
|
Posted: Wed Mar 09, 2005 12:21 pm Post subject: Re: Template, conversion implicite, fonction amie |
|
|
Est ce que tu as essayé de définir l'operateur + avec le prototype (const
Num<T>& l, const Num<T>& r) directement à la suite de sa déclaration dans la
classe. J'avais eu un problème dans ce genre mais je ne suis pas sûr que ce
soit le même car je crois que ça bloquait plutôt à la compilation.
|
|
| Back to top |
|
 |
Bertrand Motuelle Guest
|
Posted: Wed Mar 09, 2005 2:10 pm Post subject: Re: Template, conversion implicite, fonction amie |
|
|
[email]marc.boyer (AT) enseeiht (DOT) yahoo.fr.inva[/email]lid del yahoo wrote:
| Quote: | template <class T
class Num {
Num
const Num<T>& operator+=(const Num<T>& incr){...}
friend Num<T> operator+(const Num<T>& l, const Num<T>& r);
};
Tout va bien (et gcc me préviens que je fais une fonction amie non
template),
|
La partie importante est le *non template*.
| Quote: | jusqu'à ce que je doive définir la dite fonction.
J'écris
template <class T
inline Num
Num<T> tmp(l);
return tmp+= r;
}
|
Et là tu déclares et définis une fonction *template* (i.e.
différente de la famille de fonctions *non template* amies déclarées
précedemment).
| Quote: | Cela compile, mais au moment de l'édition de lien, il se plaind
d'une
undefined reference to operator+(Num<int>const &, Num<int>const &);
|
Lors de la résolution de surcharge, la fonction amie *non* template
est préférée à la fonction template. Mais tu ne lui as pas fourni
de définition donc tu obtiens une erreur lors de l'édition de liens.
Si tu définis (la fonction non template utilisée):
inline Num<int> operator+(const Num<int>& l, const Num<int>& r)
{
....
}
tout devrait compiler et lier (mais ce n'est pas, heu, très général)
Pour faire ce que recherches:
template<class T> class Num;
template<class T> Num<T> operator+(const Num<T>&, const Num<T>&);
template <class T>
class Num
{
Num<T>(const T){...}:
const Num<T>& operator+=(const Num<T>& incr){...}
friend Num<T> operator+ <>(const Num<T>& l, const Num<T>& r);
};
Le <>, sur la ligne du friend, permet de déclarer amie une
spécialisation de la fonction template.
Et ensuite implémente la fonction...
template <class T>
inline Num<T> operator+(const Num<T>& l, const Num<T>& r)
{
Num<T> tmp(l);
return tmp+= r;
}
a+
Bertrand.
|
|
| Back to top |
|
 |
marc.boyer@enseeiht.yahoo Guest
|
Posted: Fri Mar 11, 2005 12:01 pm Post subject: Re: Template, conversion implicite, fonction amie |
|
|
"Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> wrote
| Quote: | marc.boyer (AT) enseeiht (DOT) yahoo.fr.invalid del yahoo wrote:
template <class T
class Num {
Num
const Num<T>& operator+=3D(const Num<T>& incr){...}
friend Num<T> operator+(const Num<T>& l, const Num<T>& r);
};
Tout va bien (et gcc me pr=E9viens que je fais une fonction amie non
template),
La partie importante est le *non template*.
|
Ben oui, mais j'avasi cru comprendre que c'était ce qu'il fallait.
| Quote: | J'=E9cris
template <class T
inline Num
Num<T> tmp(l);
return tmp+=3D r;
}
Et l=E0 tu d=E9clares et d=E9finis une fonction *template* (i.e.
diff=E9rente de la famille de fonctions *non template* amies d=E9clar=E9es
pr=E9cedemment).
|
Oui, mais j'arrivais pas à écrire la fonction non-template qui corresponde.
| Quote: | Lors de la r=E9solution de surcharge, la fonction amie *non* template
est pr=E9f=E9r=E9e =E0 la fonction template. Mais tu ne lui as pas fourni
de d=E9finition donc tu obtiens une erreur lors de l'=E9dition de liens.
|
OK
| Quote: | Si tu d=E9finis (la fonction non template utilis=E9e):
inline Num<int> operator+(const Num<int>& l, const Num<int>& r)
{
.=2E.
}
tout devrait compiler et lier (mais ce n'est pas, heu, tr=E8s g=E9n=E9ral)
|
Oui, c'est pas vraiment le but de l'exercice.
| Quote: | Pour faire ce que recherches:
template<class T> class Num;
template<class T> Num<T> operator+(const Num<T>&, const Num<T>&);
template <class T
class Num
{
Num
const Num<T>& operator+=3D(const Num<T>& incr){...}
friend Num<T> operator+ <>(const Num<T>& l, const Num<T>& r);
};
Le <>, sur la ligne du friend, permet de d=E9clarer amie une
sp=E9cialisation de la fonction template.
|
Et les règles de recherche feront qu'il arrivera quand même
à faire la conversion implicite.
OK, merci, j'ai testé et ça semble marcher tout comme il faut.
Marc Boyer
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|