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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    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 éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    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
    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() ;
    }

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    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 éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    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 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    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.

+ 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