C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Template, conversion implicite, fonction amie

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
marc.boyer@enseeiht.yahoo
Guest





PostPosted: Wed Mar 09, 2005 12:02 pm    Post subject: Template, conversion implicite, fonction amie Reply with quote



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





PostPosted: Wed Mar 09, 2005 12:21 pm    Post subject: Re: Template, conversion implicite, fonction amie Reply with quote



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





PostPosted: Wed Mar 09, 2005 2:10 pm    Post subject: Re: Template, conversion implicite, fonction amie Reply with quote



[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





PostPosted: Fri Mar 11, 2005 12:01 pm    Post subject: Re: Template, conversion implicite, fonction amie Reply with quote

"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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.