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 :(
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 () {
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
"Fabien Garcia" <nospampliz@no.spam.city> 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.
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
"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
"Fabien Garcia" <nospampliz@no.spam.city> 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 :(
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
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
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
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
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
kanze@gabi-soft.fr writes:
Jean-Sebastien Mouret wrote:
"Fabien Garcia" <nospampliz@no.spam.city> 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.
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
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 :)
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 :)
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
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
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 ;)
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
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/
Dans le message opskva8kmfncjtax@ordi,
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 mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
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
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/
Dans le message ocFHd.50355$W33.1254704@news20.bellglobal.com,
Dans le message opskva8kmfncjtax@ordi,
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 mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
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
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 ?
Michel Michaud wrote:
Dans le message ocFHd.50355$W33.1254704@news20.bellglobal.com,
Dans le message opskva8kmfncjtax@ordi,
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)
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)