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 :

Conversion avec template


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Conversion avec template
    bonjour,
    je voudrais convertir un machin<T> en machin<U> avec un constructeur par copie alors j'ai fait:

    template <class U> Machin(const Machin<U> & m) {}

    sauf qu'il me faut aussi le contructeur par copie avec le type T (comme celui par defaut) donc j'ai rajouté :

    Machin(const Machin & m) (ou const Machin<T> & m qui fait pareil)

    mais il me dit que la fonction est déjà défini par la fonction du dessus.
    comment doit-je faire?

    merci

    ps: si quelqu'un pouvais m'expliquer aussi la différence entre template <class U> et template <typename U> merci.

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour !
    Ca ne devrait pas ressembler a un truc du genre :
    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 <class U>
    class Machin
    {
    public :
      template<class T> Machin(const Machin<T>& m)
        {
          if (T == U)
            constructeur par copie classique
           else if (T == monType)
            constructeur par conversion
          else
            erreur :  le type T n'est pas convertible
        }
    }
    P.S. : je suis pas encore tres experimente, et j'ai pas teste, j'implore votre tolerance si j'ai ecrit une grosse c...
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    non parceque template<class T> Machin(const Machin<T>& m) n'est pas considérer comme un constructeur par copie du même type (Machin<U>)
    merci quand même.
    Quelqu'un a une autre idée svp?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    P.S. : je suis pas encore tres experimente, et j'ai pas teste, j'implore votre tolerance si j'ai ecrit une grosse c...
    Oui, mais bon on ne t'en veux pas . En C++ pour écrire du code différent selon le paramètre template il faut faire de la spécialisation, càd écrire une version différente de la fonction pour chaque type spécialisé.

    Ce code ne compile pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T>
    class Bop
    {
        Bop(const Bop<T>& b) {}
     
        template <class U> Bop(const Bop<U>& b) {}
    };

    ps: si quelqu'un pouvais m'expliquer aussi la différence entre template <class U> et template <typename U> merci.
    Aucune à ma connaissance. D'ailleurs ça m'étonne, car ce n'est pas dans les habitudes du C++ de faire dans l'inutile.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ce code ne compile pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T> 
    class Bop 
    { 
        Bop(const Bop<T>& b) {} 
     
        template <class U> Bop(const Bop<U>& b) {} 
    };
    non ca fait :
    bop.cpp(6) : error C2535: '__thiscall Bop<U>::Bop<U>(const class Bop<U> &)' : member function already defined or declared
    bop.cpp(4) : see declaration of 'Bop<T>::Bop<T>'
    bop.cpp(7) : see reference to class template instantiation 'Bop<T>' being compiled

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Quel est ton compilo ?

    Si c'est VC6 ça pourrait être normal.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    +1
    Chez moi avec VC++ 7.1 ce code compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    template <class T> 
    class Bop 
    { 
    public:
        Bop() {}
        Bop(const Bop<T>& b) {} 
     
        template <class U> Bop(const Bop<U>& b) {} 
    }; 
     
    int main()
    {
        Bop<int> b1;
        Bop<float> b2( b1 );
    }

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    oui ca viens bien du compilateur VC6

    merci de votre aide

    @+

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Il doit quand même y avoir un moyen de feinter. Dans mes vagues souvenirs de COM, et de la biblio ATL, il y avait des classes (com_ptr_t<> peut-être?) qui avaient justement un constructeur normal et un template -- ou était-ce une spécialisation template...?. Ca marchait bien avec le SP4.

    Tu devrais pouvoir t'inspirer du fichier d'en-têtes correspondant. (MSDN pour le retrouver)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Loulou24
    ps: si quelqu'un pouvais m'expliquer aussi la différence entre template <class U> et template <typename U> merci.
    Aucune à ma connaissance.
    Je confirme : Aucune

    Citation Envoyé par Loulou24
    D'ailleurs ça m'étonne, car ce n'est pas dans les habitudes du C++ de faire dans l'inutile.
    Comme le mot clef typename était nécessaire par ailleurs, le coût d'ajouter un mot clef supplémentaire était déjà payé. Et des gens étaient gênés au niveau de l'équilibre de leur karma interne que l'on puisse passer un int ou un double à un template <class T> car ni int ni double ne sont des classes.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par indy2
    Ce code ne compile pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T> 
    class Bop 
    { 
        Bop(const Bop<T>& b) {} 
     
        template <class U> Bop(const Bop<U>& b) {} 
    };
    non ca fait :
    bop.cpp(6) : error C2535: '__thiscall Bop<U>::Bop<U>(const class Bop<U> &)' : member function already defined or declared
    bop.cpp(4) : see declaration of 'Bop<T>::Bop<T>'
    bop.cpp(7) : see reference to class template instantiation 'Bop<T>' being compiled
    Bon il y a une astuce pas super propre... avec VC++ 6... bon les puristes vont pas être d'accord, mais quand on à pas le choix :-/

    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        template <class U> Bop(const Bop<U>& b) {}
    tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        template <class U> Bop(Bop<U>& b) {}
    Sans le const, et cela devrait compiler

    Enjoy

Discussions similaires

  1. Problème de conversion avec CONVERT
    Par gowser dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/12/2005, 16h48
  2. [C#]datagrid avec template column contenant 1textbox ?
    Par Nycos62 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 18/11/2005, 15h01
  3. génrer fichier html avec template
    Par ramir dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2005, 13h30
  4. Appel recursif avec template
    Par Math75 dans le forum Langage
    Réponses: 24
    Dernier message: 13/10/2005, 11h57
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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