Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

genericite : probleme de declaration

6 réponses
Avatar
Yoxoman
Bonjour à tous.

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.

Est-ce possible sans déclarer f globale ?

--
"Yo!"
Martin Heidegger

6 réponses

Avatar
Fabien LE LEZ
On Tue, 1 Nov 2005 22:06:24 +0100, Yoxoman :
Comment X et f peuvent-ils être déclarés ?


template<class T> class X
{
public:
template <class U> void f (X<U> const&);
};

int main()
{
X<int> x1;
X<double> x2;
x1.f(x2);
}

Avatar
Yoxoman

On Tue, 1 Nov 2005 22:06:24 +0100, Yoxoman :
Comment X et f peuvent-ils être déclarés ?


template<class T> class X
{
public:
template <class U> void f (X<U> const&);
};

int main()
{
X<int> x1;
X<double> x2;
x1.f(x2);
}


Ah ok. Merci.

Si maintenant je cherche à implémenter cette fonction à l'exterieur de
la classe, je dois la déclarer en :

template<class T> template<class U> void X<T>::f(X<U> const&)

alors qu'un

template<class T, class U> void X<T>::f(X<U> const&)

ne passe pas. C'est normal ?


--
"Yo!"
Martin Heidegger


Avatar
Fabien LE LEZ
On Tue, 1 Nov 2005 22:44:36 +0100, Yoxoman :

je dois la déclarer en :

template<class T> template<class U> void X<T>::f(X<U> const&)


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.

Avatar
Franck Branjonneau
Yoxoman écrivait:


On Tue, 1 Nov 2005 22:06:24 +0100, Yoxoman :
Comment X et f peuvent-ils être déclarés ?


template<class T> class X
{
public:
template <class U> void f (X<U> const&);
};



Si maintenant je cherche à implémenter cette fonction à l'exterieur de
la classe, je dois la déclarer en :

template<class T> template<class U> void X<T>::f(X<U> const&)

alors qu'un

template<class T, class U> void X<T>::f(X<U> const&)

ne passe pas. C'est normal ?


Oui.

--
Franck Branjonneau



Avatar
Yoxoman

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 :

template<class T> template<class U> void X<T>::f(X<U> const&)
template<class T, class U> void X<T>::f(X<U> const&)

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

Avatar
Fabien LE LEZ
On Wed, 2 Nov 2005 09:59:41 +0100, Yoxoman :

template<class T> template<class U> void X<T>::f(X<U> const&)


-> 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.