 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
SecatOR Guest
|
Posted: Tue Feb 10, 2004 9:18 pm Post subject: Spécialisation de méthode template |
|
|
Bonjour,
J'ai une méthode template d'une classe non template, et je n'arrive pas
à en implémenter une version spécialisée, soit:
class CFile
{
template <class T> inline void ReadValue (T* pSrc);
};
et le compilateur (VC++ 6.0) n'accepte pas le code
template <> void CFile::ReadValue (float* pfSrc) { ... };
Je crois qu'il est possible de spécialiser une telle méthode, mais je
n'ai trouvé d'aide nulle part à ce sujet précis.
J'ai aussi testé une multitude d'écritures diférentes sans succès.
Merci de votre aide éventuelle
SecatOR
|
|
| Back to top |
|
 |
Gourgouilloult Guest
|
Posted: Wed Feb 11, 2004 3:48 am Post subject: Re: Spécialisation de méthode template |
|
|
SecatOR a écrit :
| Quote: |
Je crois qu'il est possible de spécialiser une telle méthode, mais je
n'ai trouvé d'aide nulle part à ce sujet précis.
J'ai aussi testé une multitude d'écritures diférentes sans succès.
|
Pour ce que j'ai cru en retenir, ça n'est pas possible : les modèles de
classes se spécialisent, les modèles de fonctions se surchargent. Par
exemple :
struct A {
template <class T> void f (const T t) {
cout << "tmpl: " << t << 'n';
}
void f (float f) {
cout << "float: " << f << 'n';
}
};
ostream& operator << (ostream& os, const A a) {
os << 'a';
return os;
}
void f () {
A a;
a.f (3.14f);
a.f (3.14);
a.f (a);
}
Affiche bien (en tout cas avec un gcc-3.3 made in mdk de base) comme on
(je ?-) pourrait s'y attendre :
float: 3.14
tmpl: 3.14
tmpl: a
Pour des explications concernant cette apparente discrimination, il vaut
mieux aller voir l'historique du groupe par google. Par ailleurs, je
suis passé tout à l'heure devant un GotW
(http://www.gotw.ca/gotw/049.htm) qui aurait tendance, maintenant que je
m'y penchouille, à me laisser supposer que je me trompe...
Donc si ça sert à quelque chose d'en faire un template malgré tout
(j'avoue ne même pas me poser la question... oui, il est tard , on
devrait au moins pouvoir écrire
struct A {
template
template <> void f <float> (float);
};
[...] qui ne marche pas (chez moi). Fainéantement, je garde mes doutes
pour l'instant. D'autant que le GotW en question est loin d'être récent,
et qu'on sait tous ce qu'il en est d'assimiler ce qu'un compilo accepte
ou rejette à ce que dit le langage.
| Quote: | Merci de votre aide éventuelle
|
La question revient régulièrement. Il y a donc plus d'aide que
nécessaire dans les archives ;)
Gourgou
|
|
| Back to top |
|
 |
Fabrizio Duhem Guest
|
Posted: Wed Feb 11, 2004 12:38 pm Post subject: Re: Spécialisation de méthode template |
|
|
"SecatOR" <the.secator (AT) free (DOT) fr> a écrit dans le message de news:
402944d9$0$285$a3f2974a (AT) nnrp1 (DOT) numericable.fr...
| Quote: | Bonjour,
J'ai une méthode template d'une classe non template, et je n'arrive pas
à en implémenter une version spécialisée, soit:
class CFile
{
template <class T> inline void ReadValue (T* pSrc);
};
et le compilateur (VC++ 6.0) n'accepte pas le code
template <> void CFile::ReadValue (float* pfSrc) { ... };
Je crois qu'il est possible de spécialiser une telle méthode, mais je
n'ai trouvé d'aide nulle part à ce sujet précis.
J'ai aussi testé une multitude d'écritures diférentes sans succès.
Merci de votre aide éventuelle
SecatOR
|
bonjour
pourquoi ne pas spécialiser des foncteurs.
exemples:
#include <iostream>
template <typename T>
struct value_reader
{
void operator()(T* src) {}
};
template <>
struct value_reader<float*>
{
void operator()(float* src)
{
// process
*src = 1.1f;
}
};
template <>
struct value_reader<int*>
{
void operator()(int* src)
{
// process
*src = 1;
}
};
struct file
{
template <typename T>
static void read(T* src)
{
value_reader<T*> reader;
reader(src);
}
};
int main()
{
float f;
int i;
file::read(&f);
std::cout << f << std::endl;
file::read(&i);
std::cout << i << std::endl;
return 0;
}
fabrizio.
|
|
| Back to top |
|
 |
Franck Branjonneau Guest
|
Posted: Wed Feb 11, 2004 7:24 pm Post subject: Re: Spécialisation de méthode template |
|
|
SecatOR <the.secator (AT) free (DOT) fr> écrivait:
Bonjour,
| Quote: | J'ai une méthode template d'une classe non template, et je n'arrive
pas à en implémenter une version spécialisée, soit:
class CFile
{
template <class T> inline void ReadValue (T* pSrc);
};
et le compilateur (VC++ 6.0) n'accepte pas le code
template <> void CFile::ReadValue (float* pfSrc) { ... };
|
template <> void CFile::ReadValue< float > (float* pfSrc) { ... };
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>
|
|
| Back to top |
|
 |
Gourgouilloult Guest
|
Posted: Wed Feb 11, 2004 10:06 pm Post subject: Re: Spécialisation de méthode template |
|
|
SecatOR a écrit :
| Quote: |
class CFile
{
template <class T> inline void ReadValue (T* pSrc);
};
|
Je viens de noter qu'on a tous répondu avec des structs. Mais ça n'a pas
l'air d'être des histoires de niveau d'accès (oui, j'ai testouillé ça en
2sec sur un compilo... je sais que c'est Mal ;)
| Quote: | et le compilateur (VC++ 6.0) n'accepte pas le code
template <> void CFile::ReadValue (float* pfSrc) { ... };
|
Juste au passage, le ';' n'a rien à voir avec la définition de la
fonction. Dis plus simplement, il n'est pas nécessaire.
| Quote: | Je crois qu'il est possible de spécialiser une telle méthode, mais je
n'ai trouvé d'aide nulle part à ce sujet précis.
J'ai aussi testé une multitude d'écritures diférentes sans succès.
|
Tant qu'à faire, on pourrait avoir une petite idée du message d'erreur ?
(Et éventuellement d'une ou deux écritures supplémentaires, accompagnées
de leurs messages d'erreurs, si toutefois ces derniers diffèrent.)
Gourgou
|
|
| Back to top |
|
 |
SecatOR Guest
|
Posted: Thu Feb 12, 2004 12:13 am Post subject: Re: Spécialisation de méthode template |
|
|
Franck Branjonneau wrote:
| Quote: | SecatOR <the.secator (AT) free (DOT) fr> écrivait:
template <> void CFile::ReadValue (float* pfSrc) { ... };
template <> void CFile::ReadValue< float > (float* pfSrc) { ... };
|
c'est en effet ce qui devrait être mais VC++ indique "internal compiler
error" avec cette syntaxe
marrant non ?
SecatOR
|
|
| Back to top |
|
 |
SecatOR Guest
|
Posted: Thu Feb 12, 2004 12:24 am Post subject: Re: Spécialisation de méthode template |
|
|
| Quote: | SecatOR <the.secator (AT) free (DOT) fr> écrivait:
template <> void CFile::ReadValue (float* pfSrc) { ... };
|
Franck Branjonneau wrote:
| Quote: | template <> void CFile::ReadValue< float > (float* pfSrc) { ... };
|
c'est en effet ce qui devrait être mais VC++ indique:
"fatal error C1001: internal compiler error"
marrant non ?
la MSDN documente globalement cette erreur par "mauvaise syntaxe ou
erreur d'optimisation". Or je suis en debug, il n'y a donc aucune
optimisation.
pour l'écriture précédente, on m'indique:
"overloaded member function not found"
SecatOR
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|