IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

template: conversion de type des instanciations via constructeur de copie


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 44
    Points
    44
    Par défaut template: conversion de type des instanciations via constructeur de copie
    Bonjour,

    Petit problème de template (sous GCC4.4.5): comment spécialiser un constructeur de (re)copie pour pouvoir convertir une instanciation d'un type en un autre type ?

    Je m'explique. Soit l'ECM suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <typename T>
    struct A
    {  T t; }
    Comment écrire le constructeur de copie pour que le code suivant compile ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
    	A<int>   a_int;
    	A<float> a_float ( a_int );
    }
    J'ai tenté une spécialisation du constructeur de copie (qui au passage m'a obligé à déclarer aussi un constructeur explicite, je ne sais pas trop pourquoi...).
    D'abord, le cas général:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template <typename T>
    struct A
    {
    	T t;
    	A();
    	A( const A& a );
    };
    template <typename T>
    A<T>::A()
    {}
     
    template <typename T>
    A<T>::A( const A<T>& a )
    { t = a.t; }
    Mais pour la spécialisation, je vois vraiment pas comment faire...
    Ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <>
    A<float>::A( const A<int>& a )
    { t=(float)a.t; }
    est refusé par gcc...
    Bref, je patauge un peu...
    Si vous aviez des idées ?

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Il faut que tu rajoutes une constructeur template, qu'on pourrait qualifié de constructeur de copie généralisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template<class T>
    struct A
    {
      A(); //default ctor
      A(const A&); //copy ctor
     
      //generalized copy ctor
      template<class U>
      A(const A<U>&)
      { /*ton code*/ }
    };
    Si le code du constructeur de copie normal a besoin d'êter écrit (ie que celui généré automatiquement ne convient pas), alors il faut l'écrire même si il est identique à celui du constructeur de copie généralisé. (sinon c'est celui généré automatiquement qui va être utilisé).

    NB: Tu es obligé d'écrire un constructeur par defaut pour que la première ligne de ton main soit valide et car comme tu déclares un constructeur (celui de copie), le constructeur par défaut n'est pas généré par le compilateur.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 45
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Il faut que tu rajoutes une constructeur template, qu'on pourrait qualifié de constructeur de copie généralisé
    Super merci, c'est exactement ça que je cherchais ! Curieusement, cette notion n'est pas souvent explicitée. Je regarderais dans un bouquin à l'occasion.

    Dernier détail, je n'arrivais pas à l'"inliner". Si je veux juste laisser la déclaration dans la classe, et mettre la définition à l'extérieur, eh bien je galerais un peu et m'appretais à poser la question, quand (pour une fois...) un message d'erreur du compilateur m'a mis sur la voie.

    Donc, pour référence ultérieure, ça s'écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<typename T>
    template<typename U>
    inline A<T>::A( const A<U>& aa )
    {
    	cout << "CCG\n";
    	t =aa.t;
    }
    (c'est pas que c'est important, c'est juste que j'essaye de garder le minimum de code dans les classes, et plutot le déporter dans un autre fichier, inliné dans le .hpp)

    NB: Tu es obligé d'écrire un constructeur par defaut pour que la première ligne de ton main soit valide et car comme tu déclares un constructeur (celui de copie), le constructeur par défaut n'est pas généré par le compilateur.
    Oui, bien sur, j'avais oublié que le constructeur de copie est avant tout un constructeur, class template ou pas...

    Encore merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 15
    Dernier message: 08/03/2009, 15h37
  2. Réponses: 12
    Dernier message: 27/01/2007, 13h32
  3. Limiter les types des paramètres templates?
    Par Pragmateek dans le forum C++
    Réponses: 9
    Dernier message: 29/08/2006, 14h14
  4. Réponses: 3
    Dernier message: 02/05/2006, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo