Fonction template dans une classe non-template ?

Le
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
Vos réponses Page 1 / 2
Trier par : date / pertinence
Fabien Garcia
Le #230099
Le Wed, 19 Jan 2005 02:30:12 +0100, Fabien Garcia

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

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

drkm
Le #230096
"Fabien Garcia"
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

Jean-Sebastien Mouret
Le #230094
"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>


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

kanze
Le #230075
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

Jean-Sebastien Mouret
Le #230073
writes:

Jean-Sebastien Mouret wrote:
"Fabien Garcia"
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



Fabien Garcia
Le #230069
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 :)
Fabien Garcia
Le #230048
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
Michel Michaud
Le #230047
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/

Michel Michaud
Le #230046
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/


Olivier Azeau
Le #230045
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 ?



Publicité
Poster une réponse
Anonyme