C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Spécialisation de méthode template

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
SecatOR
Guest





PostPosted: Tue Feb 10, 2004 9:18 pm    Post subject: Spécialisation de méthode template Reply with 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
Back to top
Gourgouilloult
Guest





PostPosted: Wed Feb 11, 2004 3:48 am    Post subject: Re: Spécialisation de méthode template Reply with quote



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 Wink, 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 ;)

Quote:
SecatOR

Gourgou


Back to top
Fabrizio Duhem
Guest





PostPosted: Wed Feb 11, 2004 12:38 pm    Post subject: Re: Spécialisation de méthode template Reply with quote




"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





PostPosted: Wed Feb 11, 2004 7:24 pm    Post subject: Re: Spécialisation de méthode template Reply with quote

SecatOR <the.secator (AT) free (DOT) fr> écrivait:

Quote:
Bonjour,

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





PostPosted: Wed Feb 11, 2004 10:06 pm    Post subject: Re: Spécialisation de méthode template Reply with quote

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





PostPosted: Thu Feb 12, 2004 12:13 am    Post subject: Re: Spécialisation de méthode template Reply with quote

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 Smile
marrant non ?

SecatOR

Back to top
SecatOR
Guest





PostPosted: Thu Feb 12, 2004 12:24 am    Post subject: Re: Spécialisation de méthode template Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.