Commment templatiser ce code ?

Le
John Deuf
Bonjour,

Soit ce code (issue de la bibliothèque SOCI) :

template<typename T>
struct TypeConversion
{
typedef T base_type;
static T from(T const &t) { return t; }
};

J'ai écrit ceci :

template<> struct TypeConversion<piece_facture<piece_int> >
{
typedef Values base_type;

static piece_facture<piece_int> from(const base_type& v)
{}

static base_type to(piece_facture<piece_int>& ma_piece)
{}
};

Et ceci (même code mais avec piece_ext au lieu de piece_int) :

template<> struct TypeConversion<piece_facture<piece_ext> >
{
typedef Values base_type;

static piece_facture<piece_ext> from(const base_type& v)
{}

static base_type to(piece_facture<piece_ext>& ma_piece)
{}
};

Y a-t-il un moyen d'utiliser le même code pour piece_int et piece_ext avec
les templates ?
Sans modifier le code de la bibliothèque.

Merci d'avance.

--
John Deuf
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #19433101
On 28 May 2009 08:47:24 GMT, John Deuf
Y a-t-il un moyen d'utiliser le même code pour piece_int et piece_ext avec
les templates ?



Si tu as
truc ... piece_ext ...
et
truc ... piece_int ...

ça se templatise en
template <class T>
truc ... T ...

Ici, tu écris donc :

template <class T>
template<> struct TypeConversion<piece_facture<T> >

à moins que j'aie loupé quelque chose ? (C'est possible, je n'ai pas
vraiment les yeux en face des trous aujourd'hui. On devrait interdire
les jours qui ne sont pas dimanche.)
John Deuf
Le #19433271
Fabien LE LEZ :

Ici, tu écris donc :

template <class T>
template<> struct TypeConversion<piece_facture<T> >

à moins que j'aie loupé quelque chose ? (C'est possible, je n'ai pas
vraiment les yeux en face des trous aujourd'hui. On devrait interdire
les jours qui ne sont pas dimanche.)



J'aurais bien aimé écrire ça aussi.

Mais visiblement, c'est trop naturel pour VC++ qui me jette avec l'erreur
suivante :
error C2913: explicit specialization; 'SOCI::TypeConversion<piece_facture
<T>>' is not a specialization of a class template

--
John Deuf
Michael Doubez
Le #19433491
On 28 mai, 12:11, John Deuf
Fabien LE LEZ :

> Ici, tu écris donc :

> template <class T>
> template<> struct TypeConversion<piece_facture<T> >



Il y a un 'template<>' de trop:
template <class T>
struct TypeConversion<piece_facture<T> >
{...


> à moins que j'aie loupé quelque chose ? (C'est possible, je n'ai pa s
> vraiment les yeux en face des trous aujourd'hui. On devrait interdire
> les jours qui ne sont pas dimanche.)

J'aurais bien aimé écrire ça aussi.

Mais visiblement, c'est trop naturel pour VC++ qui me jette avec l'erreur
suivante :
error C2913: explicit specialization; 'SOCI::TypeConversion<piece_facture
<T>>' is not a specialization of a class template



Tu as bien mis la spécialisation après la déclaration du template
général ?

--
Michael
John Deuf
Le #19433861
Michael Doubez :

Il y a un 'template<>' de trop:
template <class T>
struct TypeConversion<piece_facture<T> >
{...



Effectivement ! Avec un seul "template <>" ça fonctionne.
Merci à vous deux !

--
John Deuf
Publicité
Poster une réponse
Anonyme