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 :

Gestion d'un template


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 Gestion d'un template
    Bonjour.

    J'apprends le concept de Template, dans le but de simplifier mon code et d'utiliser une class template pour gérer de la même façon différents types d'objets ( il me semble bien que cela peut servir a ca ).

    Cependant, quand je tape ceci :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
     
    template < typename T >
    class OBJECT_Template
    {
     
    public :
     
        OBJECT_Template () {}
        ~OBJECT_Template () {}
     
        template < typename Ti > void                           setObject ( Ti &target )
        {
            std::unique_ptr < T > model ( new T ( target ));
            _template_vector.push_back ( std::move ( model ) ) ;
        }
     
        void                                                    update ()
        {
     
            for (  std::vector < std::unique_ptr < T > > :: iterator it = _template_vector.begin() ; it != _template_vector.end() ; it ++ )
            {
                ( *it ) -> update() ;
            }
        }
     
    private :
     
        std::vector < std::unique_ptr < T > >                   _template_vector ;
    };
    il me dit ceci :

    "error:need ' typename ' before ' std::vector < std::unique_ptr < T > > :: iterator ' because ' std::vector < std::unique_ptr < T > > ' is a dependent scope.

    Qu'a cela ne tienne, je rajoute ( bêtement ) typename devant vector :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
            for ( typename std::vector < std::unique_ptr < T > > :: iterator it = _template_vector.begin() ; it != _template_vector.end() ; it ++ )
            {
                ( *it ) -> update() ;
            }
    et en effet, ca compile, et le programme fonctionne.

    Mais la fonction update de mon objet n'opère pas.

    Savez vous d'où cela pourrait provenir ?

    Merci si vous pouvez m'aider

  2. #2
    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
    Autant pour moi, cela fonctionne.

    En revanche, il y a quelque chose qui me taraude avec les templates : est-il possible de faire une template qui puisse accumulier, par exemple, différents templates : l'idée serait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    std::vector < TemplateQuiAccumuleDesTemplates < nimporteQuelTemplate?? > >   _superTemplate ;
     
    superTemplate.addTemplate ( 45 ) ;
    superTemplate.addTemplate ( objetDivers ) ;
    superTemplate.addTemplate ( "salut les copains de developpez" ) ;
    etc...
    Bien sur ca na marche pas, car il faut toujours préciser quel objet peut être mis en template. Du coup, ca devient moins intéressant, a moins qu'il y ait une methode pour faire ce genre de choses ?

  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 156
    Points
    3 156
    Par défaut
    Citation Envoyé par mazertys17 Voir le message
    Bien sur ca na marche pas, car il faut toujours préciser quel objet peut être mis en template.
    Non, le mécanisme de déduction des templates permet de ne pas forcément le préciser. Exemple:

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
     
    struct Test {
      template <typename T> void print(T const& value) { std::cout << value << std::endl; }
    };
     
    int main() {
      Test t;
      t.print(1);
      t.print(3.f);
      t.print("Salut");
      return 0;
    }

    Par contre, ça implique, dans ton cas d'usage, que tous les objets ajoutés dans la collection soient du même type et donc dérivent d'une classe parente commune (bonne exemple d'usage de l'héritage ici). En l'occurence, la classe parente doit posséder une fonction membre virtuelle (pure ou non) qui s'appelle update.

    C'est hors sujet mais pense au ranged-based for loop :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (auto& element : _template_vector) {
      if (element)
        element->update() ;
    }
    Find me on github

  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
    Je suis pas sur d'avoir tout compris, mais ça viendra j'espère, merci pour les liens.

    ps : merci jblecanard pour le filon ( sur auto ), ca va éclaircir mon code !

  5. #5
    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 y a une chose que j'ai du mal a saisir. Je crée un Template qui fonctionne avec un objet, mais pas un autre, alors qu'il est bâti sur le même model. C'est sur le destructeur de l'objet qu'intervient l'erreur, dès lors que je t'ente d'implémenter le template, avec l'objet en question dans une class. Il me dit : "error: within this context"

    avant, il y a des messages d'avertissement, sur le constructeur de ma class template :

    "required from 'OBJECT_Template<T>::OBJECT_TEemplate() [with T = OBJECT_HUD]'

    j'ai pourtant bien inulde mon "OBJECT_HUD.h"

    et enfin il me dit "required from here" au constructeur de mon object pricipale qui est censé contenir la template.
    chose étonant, le même template fonctionne avec un autre objet.

    Si je vide toutes les fonctions de mon template, pour ne laisser que le constructeur/destructeur, toujours le même problème :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
    #include "OBJECT_Base.h"
    #include "OBJECT_HUD.h"
     
    template < typename T >
    class OBJECT_Template
    {
     
    public :
     
        OBJECT_Template () {}
        ~OBJECT_Template () {}
     
        template < typename Ti > void setObject ( Ti &target , float x , float y )
        {
     
        }
     
        void initializes ()
        {
     
        }
     
        void update ()
        {
     
        }
     
        bool  contiend ( std::string name )
        {
     
     
     
            return true ;
        }
     
     
        std::unique_ptr < T >  getObject ( std::string name )
        {
            std::unique_ptr < T > model ( new T );
     
     
            return std::move ( model )  ;
        }
     
     
    private :
     
        std::vector < std::unique_ptr < T > >                   _template_vector ;
    };
    En revanche, si j'enlève l'attribu en private, alors il compile.

    J'ai du mal a saisir pourquoi.

    Merci si vous pouvez m'aider .

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ma boule de crystal n'est pas parvenue à me montrer le code de Object_hud.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    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 156
    Points
    3 156
    Par défaut
    Hello

    std::unique_ptr possède la particularité d'avoir besoin du destructeur de l'objet pointé pour être instancié, contrairement à shared_ptr pour qui une forward declaration suffit. Ton problème provient très probablement d'une erreur vis à vis de Object_HUD. Par exemple, le destructeur doit être au minimum public, or la visibilité par défaut des membres d'une classe est privée. Par contre tu pourrais nous donner plus d'info sur les messages d'erreurs que tu as ?

    Voici un exemple qui provoque un problème similaire :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <memory>
    #include <vector>
     
    class A {
      virtual ~A() {};
    };
     
    template <typename T> class Accumulator {
      std::vector<std::unique_ptr<T>> member_;
    };
     
    int main() {
      Accumulator<A> acc;
      return 0;
    }

    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
    /usr/include/c++/4.9/bits/unique_ptr.h: In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = A]':
    /usr/include/c++/4.9/bits/unique_ptr.h:236:16:   required from 'std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = A; _Dp = std::default_delete<A>]'
    /usr/include/c++/4.9/bits/stl_construct.h:93:7:   required from 'void std::_Destroy(_Tp*) [with _Tp = std::unique_ptr<A, std::default_delete<A> >]'
    /usr/include/c++/4.9/bits/stl_construct.h:103:46:   required from 'static void std::_Destroy_aux<<anonymous> >::__destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = std::unique_ptr<A, std::default_delete<A> >*; bool <anonymous> = false]'
    /usr/include/c++/4.9/bits/stl_construct.h:127:27:   required from 'void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = std::unique_ptr<A, std::default_delete<A> >*]'
    /usr/include/c++/4.9/bits/stl_construct.h:151:31:   required from 'void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator<_T2>&) [with _ForwardIterator = std::unique_ptr<A, std::default_delete<A> >*; _Tp = std::unique_ptr<A, std::default_delete<A> >]'
    /usr/include/c++/4.9/bits/stl_vector.h:425:30:   required from 'std::vector<_Tp, _Alloc>::~vector() [with _Tp = std::unique_ptr<A, std::default_delete<A> >; _Alloc = std::allocator<std::unique_ptr<A, std::default_delete<A> > >]'
    main.cc:13:29:   required from here
    main.cc:5:11: error: 'virtual A::~A()' is private
       virtual ~A() {};
               ^
    In file included from /usr/include/c++/4.9/memory:81:0,
                     from main.cc:1:
    /usr/include/c++/4.9/bits/unique_ptr.h:76:2: error: within this context
      delete __ptr;
    Le message d'erreur est clair dans ce cas : main.cc:5:11: error: 'virtual A::~A()' is private.
    Find me on github

  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
    Encore un grand merci a jblecanard !!

    Une lecture de votre réponse et un simple click résoud le problème !

    le destructeur doit être au minimum public
    J'avais en effet tout simplement oublié de mettre "public" avant le constructeur/destructeur !

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

Discussions similaires

  1. [ZF 1.10] Gestion de "blocs" (notion générale de templates)
    Par cow_boy17 dans le forum MVC
    Réponses: 7
    Dernier message: 18/08/2011, 18h10
  2. JSF et la gestion des templates
    Par archer dans le forum JSF
    Réponses: 2
    Dernier message: 23/11/2010, 19h20
  3. Gestion de documents, templates, placeholders
    Par thegreatbato dans le forum Oracle
    Réponses: 1
    Dernier message: 10/07/2009, 12h36
  4. Réponses: 5
    Dernier message: 16/02/2008, 05h55
  5. Gestion d'un système de template en PHP
    Par Yoshio dans le forum Langage
    Réponses: 0
    Dernier message: 24/08/2006, 21h41

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