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

Commment templatiser ce code ?

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

4 réponses

Avatar
Fabien LE LEZ
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.)
Avatar
John Deuf
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
Avatar
Michael Doubez
On 28 mai, 12:11, John Deuf wrote:
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
Avatar
John Deuf
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