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

C++ Discussion :

template, et utilisation dans une class


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut template, et utilisation dans une class
    Bonjour ( re )

    Encore une petite question sur les template :

    Peut-on creer une fonction template dans une class normal ?

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    class Object
    {
    public :
    ...
      template < typename T > std::unique_ptr < T >    chargeUnObjetUniquePtr ( std::unique_ptr < T > objet ) 
     {
        object -> faitQuelquechose( bidul , &truck ) ;
      return sd::move ( object ) ;
     }
    ...
    }
    ( a condition bien sur que le template soit addapté à l'objet )

    J'ai essayé, il ca ne colle pas...

  2. #2
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    oui on peut. Qu'est-ce qui ne va pas ? Quelle erreur obtiens-tu ?

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 159
    Points
    3 159
    Par défaut
    Oui on peut et le problème n'a rien à voir avec les template, tu commets une erreur : l'argument std::unique_ptr est passé par copie, or un unique_ptr ne peut pas être copié, seulement déplacé ou référencé. Du reste, si tu retourne la valeur passée en argument au début, pourquoi vouloir la déplacer et la re-déplacer en sortie ? Il faut utiliser une référence, tout simplement. Autre remarque : il n'y a pas besoin de std::move lorsque tu retournes par valeur, ce sera fait naturellement si l'objet est déplaçable (même si je le rappelle, ici il ne faut ni copier ni déplacer).

    Tu t'attaques directement aux templates sans même maîtriser des concepts plus basiques comme les références. Je suggère que tu commences par avaler un bouquin de C++ avant de beaucoup coder .

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Il faut utiliser une référence, tout simplement.


    mais c'est bien sur ! J'avoue que je me suis un peu précipiter a coder, sans pour autant avoir bien assimilé toutes les notions... ( et je commence enfin a comprendre certaines choses de bases ) .J'ai bien lu un bouquin sur le c++, mais c'est sans doute insuffisant. Je pense néanmoins que la pratique reste une bonne façon de progresser, surtout si on a la chance d'avoir accès a des forum comme celui ci ! ( encore un grand merci, d'ailleurs, a toute l'équipe ) . Bien sur il ne faut pas compter que dessu . C'est d'ailleurs pourquoi j'en arrive a 'bidouiller' des codes, comme celui sur ce poste avec les unique_ptr, par ex... ( ca fonctionne, mais c'est pas orthodoxe ). Donc, merci pour le conseil. Je vais essayer de trouver d'autres livres et de potasser toujours un peu plus .

    J'ai donc allégé ma fonction grâce aux références, cependant, le problème persiste. Ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
        std::unique_ptr < OBJECT_Base > model ( new OBJECT_Base ) ;
     
        for ( auto &it : _RESOURCES_Object )
        {
            if ( it -> contiendObject ( name ) )
            {
                it -> loadObject_Base ( *model , name ) ; //ici, ca marche, mais uniquement avec mon Object_base
                it -> loadOBJECT ( *model , name ) ; // c'est pourquoi j'aimerais transmormer la fonction en template, pour élargir
                                                                       // les possibilités avec d'autres objets qui sont 'agrégationné', si j'ose dire (et 
                                                                       // si je dis pas de bêtises ) , de la même facon...
            }
        }
    et voici ma fonction template, dans mon objet RESOURCES_Object ( dirrectement le fichier cpp )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    template < typename T > void RESOURCES_Object::loadOBJECT (  T  &object , std::string name )
    {
     
    }
    le compilateur me dit :

    " undefined reference to 'void RESOURCES_Object::loadOBJECT< OBJECT_Base>(OBJECT_Base&, std::string)"

  5. #5
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    La définition de la fonction template doit se situer dans le header pas dans le cpp.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    La définition de la fonction template doit se situer dans le header pas dans le cpp.
    bien vu ! Merci, maintenant, ca compile.

    J'avais oublié qu'on ne pouvais pas utiliser des templates dans les cpp...J'ai lu quelquepart que c'était logique, et qu'un template dans un cpp n'aurait pas de sens...

    Mais j'avoue que je vois pas trop pourquoi. Et en l’occurrence, ca alourdie beaucoup le code, nan? dans mon cas, c'est une fonction qui fait appel au disque dur pour charger des donnés, donc je risque de me retrouver avec une class dans le header super longue, c'est normal ?

  7. #7
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    la définition ce n'est pas le prototype.

    La définition de la fonction c'est son implémentation, qui, pour une fonction template, doit aussi se trouver dans le header.

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Oui, merci, kaamui !

    je viens de rectifier ma réponse, d'avant, en constatant que c'était bien là l'erreur.

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Ok, merci pour tout, je crois que j'ai trouvé ce qu'il fallait en terme de doc, pour résoudre le pb

    http://cpp.developpez.com/faq/cpp/?p...-les-templates

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/04/2011, 10h32
  2. Réponses: 1
    Dernier message: 12/04/2009, 17h54
  3. Réponses: 4
    Dernier message: 25/10/2007, 17h18
  4. template et utilisation avec une classe existante
    Par vartav dans le forum Langage
    Réponses: 6
    Dernier message: 14/03/2007, 10h39
  5. Réponses: 4
    Dernier message: 08/11/2005, 15h10

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