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

Fonction template dans une classe non-template ?

11 réponses
Avatar
Fabien Garcia
Bonsoir,

Bon je vais surement paraitre debile mais je n'arrive pas a trouver
la reponse sur le web...
Est il possible (correct) de declarer une fonction membre template dans
une classe qui n'est pas une template et si c'est le cas comment
en faire l'appel ? (j'espere que ma terminologie est suffisement claire)
J'ai fait qq chose du type :

class A {
public:
// constructeurs, destructeur, ...

template <class T>
T* ma_fonction ();

};

template <class T>
T* ma_fonction ()
{
return (T*)NULL; // C'est juste un test de compil
}

int main()
{
A obj;

obj.ma_fonction<float> (); // Erreur de compil : "error C2062: type
'float' unexpected"
}

J'utilise VC++ pour cette compil, je n'ai pas de quoi le tester sur autre
chose ici :(

Merci de votre aide

Fabien

10 réponses

1 2
Avatar
Fabien Garcia
Le Wed, 19 Jan 2005 02:30:12 +0100, Fabien Garcia
a écrit:

template <class T>
T* ma_fonction ()
{
Une erreur ici, il faut lire :

template <class T>
T* A::ma_fonction ()
{

Avatar
drkm
"Fabien Garcia" writes:

Est il possible (correct) de declarer une fonction membre template dans
une classe qui n'est pas une template et si c'est le cas comment
en faire l'appel ? (j'espere que ma terminologie est suffisement claire)


Oui (possible et claire).

obj.ma_fonction<float> (); // Erreur de compil : "error C2062: type
'float' unexpected"


Étrange. Le code me paraît correct.

J'utilise VC++ pour cette compil, je n'ai pas de quoi le tester sur autre
chose ici :(


Je ne connais pas, mais il me semble que les versions jusque 6 (si
je ne me trompe pas) étaient loin d'être réputées pour leur support
des modèles. J'ai d'ailleurs en tête les modèles membres en
particulier.

--drkm

Avatar
Jean-Sebastien Mouret
"Fabien Garcia" writes:

Bonsoir,

Bon je vais surement paraitre debile mais je n'arrive pas a trouver
la reponse sur le web...
Est il possible (correct) de declarer une fonction membre template dans
une classe qui n'est pas une template et si c'est le cas comment
en faire l'appel ? (j'espere que ma terminologie est suffisement claire)
J'ai fait qq chose du type :

class A {
public:
// constructeurs, destructeur, ...

template <class T>


template <typename T>

T* ma_fonction ();

};

template <class T>
T* ma_fonction ()


template<typename T> T* A::ma_fonction()

{
return (T*)NULL; // C'est juste un test de compil
}

int main()
{
A obj;

obj.ma_fonction<float> (); // Erreur de compil : "error C2062: type
'float' unexpected"
}

J'utilise VC++ pour cette compil, je n'ai pas de quoi le tester sur autre
chose ici :(

Merci de votre aide

Fabien


--
js

Avatar
kanze
Fabien Garcia wrote:

Est il possible (correct) de declarer une fonction membre
template dans une classe qui n'est pas une template et si
c'est le cas comment en faire l'appel ? (j'espere que ma
terminologie est suffisement claire) J'ai fait qq chose du
type :

class A {
public:
// constructeurs, destructeur, ...

template <class T>
T* ma_fonction ();

};

template <class T>
T* ma_fonction ()


| T* A::ma_fonction()
évidemment.

{
return (T*)NULL; // C'est juste un test de compil
}

int main()
{
A obj;

obj.ma_fonction<float> (); // Erreur de compil : "error C2062: type

'float' unexpected"
}

J'utilise VC++ pour cette compil, je n'ai pas de quoi le
tester sur autre chose ici :(


C'est légal selon la norme, mais ce n'est pas dit que c'est
supporté par des compilateurs plus anciens. Il ne marche pas
avec la version de Sun CC dont je me sers (5.1), par exemple, et
ça m'étonnerait qu'il marche avec VC++ 6.0.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Jean-Sebastien Mouret
writes:

Jean-Sebastien Mouret wrote:
"Fabien Garcia" writes:

template <class T>


template <typename T>


C'est pareil selon la norme. En fait, j'ai eu des problèmes avec
le typename avec certains compilateurs anciens. Ils le
supportaient, mais pas dans tous les cas.

Il y a aussi des cas dans la norme où typename est nécessaire,
mais où certains anciens compilateurs ne permettent rien. Si on
est concerné par la portabilité vers d'anciens compilateurs, il
est préférable d'utiliser class ici, et typename pour spécifier
qu'un nom dépendant désigne un type ; avec un ancien
compilateur, on ajoute quelque part l'équivalent de
| #define typename
et ça marche.

Avec un compilateur récent, évidemment, qu'on utilise typename
ou class ci-dessus n'est qu'une question de goût.



dans l'idée, j'utilise typename quand le parametre peut etre un pod.


--
js



Avatar
Fabien Garcia
Apres moultes recherches un peu partout, j'ai en effet eu confirmation du
fait
que VC++ 6.0 ne supporte en effet pas les fonctions membres templates.
J'ai trouve un controunement pour ce bug, il suffit de mettre un parametre
inutile
dans la fonction avec le type parametre de la template ou un pointeur sur
ce type.
L'appel :
obj.ma_fonction ((float)10.0);
spécialise automatiquement la fonction template et ca marche ...

De plus apres test du code que j'ai poste sur g++ ca compile sans probleme
(mais c'est bizare c'ea fait pas grand chose :p )

Merci a tous en tout cas, ca me prouve que je suis pas totalement nul :)
Avatar
Fabien Garcia
Apres moultes recherches, il semble qu'en effet VC++ 6.0 ne
supporte pas les fonctions membres templates. Le seul moyen
de passer outre ce probleme que j'ai put trouver est d'ajouter
un parametre inutile a la foncion qui a pour type le type parametre
de la template :
T* A::ma_fonction (T dummy);

Et a l'appel :
obj.ma_fonction ((float)10.0);

Ca permet de specialiser la template 'automatiquement' et ca fonctionne
sous VC++ 6.0 :/

Sinon le code que j'avais fourni compile sous g++ (mais il fait pas
grand chose bizare hein ?).
Merci de vos reponse, ca rassure ;)

Fabien
Avatar
Michel Michaud
Dans le message ,
Apres moultes recherches, il semble qu'en effet VC++ 6.0 ne
supporte pas les fonctions membres templates.


Je vais regarder le reste de tes messages attentivement, parce
que ce que tu dis est généralement faux, puisque même VC 5.0
supportait assez bien les fonctions membres templates...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Michel Michaud
Dans le message ocFHd.50355$,
Dans le message ,
Apres moultes recherches, il semble qu'en effet VC++ 6.0 ne
supporte pas les fonctions membres templates.



En fait, il ne supporte pas la spécification explicite comme
tu le faisais... En passant, VC 6.0, c'est très vieux... (il
y a trois versions depuis, et ça fonctionne au moins avec les
deux dernières)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Olivier Azeau
Michel Michaud wrote:
Dans le message ocFHd.50355$,

Dans le message ,

Apres moultes recherches, il semble qu'en effet VC++ 6.0 ne
supporte pas les fonctions membres templates.




En fait, il ne supporte pas la spécification explicite comme
tu le faisais... En passant, VC 6.0, c'est très vieux... (il
y a trois versions depuis, et ça fonctionne au moins avec les
deux dernières)



3 versions ?



1 2