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

Spécialisation de méthode template

6 réponses
Avatar
SecatOR
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

6 réponses

Avatar
Gourgouilloult

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 <class T> void f (const T);
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.

Merci de votre aide éventuelle


La question revient régulièrement. Il y a donc plus d'aide que
nécessaire dans les archives ;)

SecatOR


Gourgou

Avatar
Fabrizio Duhem
"SecatOR" a écrit dans le message de news:
402944d9$0$285$
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.

Avatar
Franck Branjonneau
SecatOR écrivait:

Bonjour,


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) { ... };


template <> void CFile::ReadValue< float > (float* pfSrc) { ... };

--
Franck Branjonneau

Avatar
Gourgouilloult

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

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.

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

Avatar
SecatOR
Franck Branjonneau wrote:
SecatOR é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


Avatar
SecatOR
SecatOR écrivait:
template <> void CFile::ReadValue (float* pfSrc) { ... };



Franck Branjonneau wrote:
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