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 :

Vecteur de template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut Vecteur de template
    Bonjour tout le monde,

    J'ai un petit soucis avec les template.

    Je cherche à créer un vecteur contenant des elements d'une classe Test qui est une classe template.

    L'idée serait de pouvoir mettre dans se vecteur des instance de Test qui puissent être de type différent (ex : Test<int> ; Test<string> ; ...).

    Après avoir un peu cherché j'ai vu qu'il était conseillé de passer par une classe de base (appelons la TestDeBase) et de créer un vecteur de TestDeBase*.

    J'ai donc créé les fichiers suivants :

    TestDeBase.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class TestDeBase{
    	public :
    		TestDeBase(){}
    };
    Test.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include"TestDeBase.cpp"
     
    template<typename T>
    class Test : TestDeBase{
    	public :
    		Test() : TestDeBase(){}
    };
    main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<stdlib.h>
    #include<stdio.h>
    #include<vector>
    using namespace std;
    #include"Test.cpp"
     
    int main(int argc, char *argv[]){
    	vector<TestDeBase *> vect();
    	Test<int> test();	
    	vect.push_back(&test);
     
    	return EXIT_SUCCESS;
    }
    Hélas le compilateur ne semble pas apprécier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.cpp: In function 'int main(int, char**)':
    main.cpp:11: error: request for member 'push_back' in 'vect', which is of non-class type 'std::vector<TestDeBase*, std::allocator<TestDeBase*> > ()()'

    Je m'y suis mal pris ?
    Ce n'est pas la bonne méthode ?
    Vous avez plus simple ?

    Si vous avez la réponse à une de ces questions merci d'avance !

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Retire les () à droite des déclarations de vect et test.

    MAT.

  3. #3
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Car tu déclares des fonctions et pas des variables avec cette syntaxe.

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Ce que tu cherches à faire s'appelle "Type Erasure".
    Le meilleur article que j'ai lu à ce sujet, de loin : http://www.artima.com/cppsource/type_erasure.html

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut
    Effectivement pour les ()

    @Alp : Je n'ai pas lu en détail encore, mais la solution proposée par le lien, semble utiliser la librairie boost. Il n'y aurait pas une solution utilisant les librairies standard ?
    Je vais continuer de le lire quand j'aurais plus de temps.
    EDIT : ah il y a peut être une solution sans le boost mais je n'ai vraiment plus de temps là :p

    En attendant je continue sur mon programme. Après suppression des parenthèses j'obtient le main.cpp suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<stdlib.h>
    #include<stdio.h>
    #include<vector>
    using namespace std;
    #include"Test.cpp"
     
    int main(int argc, char *argv[]){
     
    	vector<TestDeBase *> vect;
    	Test<int> test;	
    	vect.push_back(&test);
     
    	return EXIT_SUCCESS;
    }

    Et l'erreur de compilation suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gcc main.cpp -o pl
    main.cpp: In function ‘int main(int, char**)’:
    main.cpp:11: erreur: ‘TestDeBase’ is an inaccessible base of ‘Test<int>’
    [zales@gmlin34 TesttemplateC]$

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Pour que ton héritage soit polymorphique, il doit être public (sinon, violation manifeste du LSP)

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T>
    class Test : public TestDeBase{
    	public :
    		Test() : TestDeBase(){}
    };
    Tu noteras le simple rajout du mot "public" lors de la déclaration d'héritage, car l'héritage par défaut est privé en C++.

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par SAKDOSS Voir le message
    @Alp : Je n'ai pas lu en détail encore, mais la solution proposée par le lien, semble utiliser la librairie boost. Il n'y aurait pas une solution utilisant les librairies standard ?
    Je vais continuer de le lire quand j'aurais plus de temps.
    EDIT : ah il y a peut être une solution sans le boost mais je n'ai vraiment plus de temps là :p
    Non, cela ne nécessite absolument pas Boost. C'est juste qu'un des modules de Boost illustre parfaitement la technique de Type Erasure, et qui revient exactemet à ce que tu essayes de faire. C'est donc une illustration, n'ais pas peur dès qu'il y a des "boost::"

Discussions similaires

  1. Réponses: 15
    Dernier message: 02/07/2007, 08h23
  2. Tableau contenant des Vecteurs Template ?
    Par ExSter dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2007, 11h41
  3. Réponses: 2
    Dernier message: 08/12/2006, 01h20
  4. Mettre un vecteur template dans une class
    Par Dimitri_87 dans le forum Langage
    Réponses: 8
    Dernier message: 04/12/2006, 19h33
  5. [Templates][VS2005]Vecteur et templates
    Par bootix dans le forum Visual C++
    Réponses: 1
    Dernier message: 20/11/2006, 22h59

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