Je me permet de vous soumettre un petit problème. La solution est peut-
être évidente, mais je ne sais pas.
Soit un truc débile, du genre :
X<int> x1;
X<double> x2;
x1.f(x2);
Comment X et f peuvent-ils être déclarés ?
template<class T> class X
{
public:
void f(X x);
// ...
};
Bien sûr, il manque quelque chose... du genre template<class U> quelque
part. Cependant, je ne voudrais pas déclarer mon objet X avec les deux
paramètres, et je voudrais que f puisse prendre en compte n'importe quel
type de X.
A tort peut-être, je pensais que le template<class Machin> servait à dire au compilateur "Attention, je vais mettre des expressions Machin un peu partout, débrouille-toi pour lui coller le type qui convient après". C'est pourquoi je me demandais pourquoi la seconde expression, plus courte et plus concise, n'était pas admise.
-- "Yo!" Martin Heidegger
Qu'est-ce qui te paraît bizarre là-dedans ?
Si tu écris
template<class T> class X
{
void g();
}
tu commenceras la définition comme suit :
template <class T> void X<T>::g()
Ici le "void g()" est remplacé par "template<class U> void f(X<U>
const&)", donc tu effectues le même remplacement dans la définition de
la fonction.
Bien sûr. En fait, ma question posait sur la différence entre ces deux
expressions :
A tort peut-être, je pensais que le template<class Machin> servait à
dire au compilateur "Attention, je vais mettre des expressions Machin un
peu partout, débrouille-toi pour lui coller le type qui convient après".
C'est pourquoi je me demandais pourquoi la seconde expression, plus
courte et plus concise, n'était pas admise.
A tort peut-être, je pensais que le template<class Machin> servait à dire au compilateur "Attention, je vais mettre des expressions Machin un peu partout, débrouille-toi pour lui coller le type qui convient après". C'est pourquoi je me demandais pourquoi la seconde expression, plus courte et plus concise, n'était pas admise.
-> f() est une fonction template (à un argument) membre d'une classe template (à un argument elle aussi).
template<class T, class U> ...
-> Tu définis une fonction (ou une classe) template à deux arguments.
A tort peut-être, je pensais que le template<class Machin> servait à dire au compilateur "Attention, je vais mettre des expressions Machin un peu partout, débrouille-toi pour lui coller le type qui convient après".
Il y a tout de même un peu plus de logique là-dessous.
On Wed, 2 Nov 2005 09:59:41 +0100, Yoxoman <yoxoman@aol.com>:
-> f() est une fonction template (à un argument) membre d'une classe
template (à un argument elle aussi).
template<class T, class U> ...
-> Tu définis une fonction (ou une classe) template à deux arguments.
A tort peut-être, je pensais que le template<class Machin> servait à
dire au compilateur "Attention, je vais mettre des expressions Machin un
peu partout, débrouille-toi pour lui coller le type qui convient après".
Il y a tout de même un peu plus de logique là-dessous.
-> f() est une fonction template (à un argument) membre d'une classe template (à un argument elle aussi).
template<class T, class U> ...
-> Tu définis une fonction (ou une classe) template à deux arguments.
A tort peut-être, je pensais que le template<class Machin> servait à dire au compilateur "Attention, je vais mettre des expressions Machin un peu partout, débrouille-toi pour lui coller le type qui convient après".
Il y a tout de même un peu plus de logique là-dessous.