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

SL & STL C++ Discussion :

iterateur de list de pointeur vers classe abstraite avec template


Sujet :

SL & STL C++

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 263
    Points : 255
    Points
    255
    Par défaut iterateur de list de pointeur vers classe abstraite avec template
    Bonjour,

    je me doute que le titre n'est pas très clair donc je vais expliquer plus longuement mon problème.

    J'ai une classe "Constraint". Cette classe est purement abstraite et utilise des template. Voici sa définition
    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
    //Constraint.h
    #ifndef _CONSTRAINT_H
    #define	_CONSTRAINT_H
     
    #include "./Variable.h"
    #include "./Iterator.h"
    #include <iostream>
    #include <stdexcept>
    #include <string>
     
    class ConstraintException : public std::runtime_error {
    public:
        ConstraintException(std::string msg);
    };
     
    template<class T>
    class Constraint {
    public:
        virtual Iterator<Variable<T>*>* getVars() const = 0;
        virtual bool isSatisfiable() const = 0;
        virtual void assign(const Variable<T> * const var, const Constant<T> * const c) = 0;
        virtual void free(const Variable<T> * const var) = 0;
        virtual ~Constraint();
    };
    #endif
     
    //Constraint.cpp
    #include "Constraint.h"
     
    ConstraintException::ConstraintException(std::string msg) : std::runtime_error(msg) { }
     
    template<class T>
    Constraint<T>::~Constraint() { }
    Je voudrais créer une classe ConjunctionConstraint qui soit conforme à celle-ci. Voici ce que j'ai fait:
    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
    //ConjunctionConstraint.h
    #ifndef _CONJUNCTIONCONSTRAINT_H
    #define	_CONJUNCTIONCONSTRAINT_H
     
    #include "./Constraint.h"
    #include <list>
     
    template<class T>
    class ConjunctionConstraint : public Constraint<T> {
    private:
        std::list<Constraint<T>*>* constraints;
    public:
        ConjunctionConstraint();
        virtual ~ConjunctionConstraint();
        Iterator<Constraint<T>*> getConstraintIterator() const;
        bool isPresent(const Constraint<T>* const cons) const;
        void addConstraint(Constraint<T>* cons) throw(ConstraintException);
        void removeConstraint(Constraint<T>* cons) throw(ConstraintException);
        virtual Iterator<Variable<T>*>* getVars() const;
        virtual bool isSatisfiable() throw (ConstraintException);
        virtual void assign(const Variable<T> * const var, const Constant<T> * const value);
        virtual void free(const Variable<T> * const var) = 0;
     
    };
    #endif
     
    //ConjunctionConstraint.cpp
    #include "./ConjunctionConstraint.h"
     
    using namespace std;
     
    template<class T>
    ConjunctionConstraint<T>::ConjunctionConstraint() : Constraint<T>() {
      constraints = new list<Constraint<T>*>();
    }
     
    template<class T>
    ConjunctionConstraint<T>::~ConjunctionConstraint() {
      delete(constraints);
    }
     
    template<class T>
    bool ConjunctionConstraint<T>::isPresent(const Constraint<T>* cons) const {
      list<Constraint<T>*>::iterator it;
      for(it = constraints->begin(); it != constraints->end(); it++) {
        if(*it == cons) {
          return true;
        }
      }
      return false;
    }
    Et lorsque je tente de compiler, j'obtiens l'erreur suivante:
    Citation Envoyé par g++ 4.4.1
    src/finiteDomain/ConjunctionConstraint.cpp: In member function ‘bool ConjunctionConstraint<T>::isPresent(const Constraint<T>*) const’:
    src/finiteDomain/ConjunctionConstraint.cpp:18: erreur: expected ‘;’ before ‘it’
    src/finiteDomain/ConjunctionConstraint.cpp:19: erreur: ‘it’ was not declared in this scope
    Je ne comprend pas mon erreur. J'ai l'impression qu'il ne reconnait pas le type Constraint<T>* dans l'initialisation "list<Constraint<T>*>::iterator it;". Or il ne devrait pas y avoir de problèmes (à première vue) puisque le type est défini via l'inclusion du fichier Constraint.h.
    Je me suis demandé si c'est possible de créer une liste de ce type, mais il me semble que oui car sinon gcc se serait plaint lors de sa création. Donc, j'ai du faire quelque chose de travers.

    Est-ce que quelqu'un voit ce que je n'ai pas fait?

    D'avance, merci

  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 263
    Points : 255
    Points
    255
    Par défaut
    Voilà ou j'en suis:

    J'ai essayé de faire la fonction paramétrée annexe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <class T>
    bool isP(list<T*>* liste, T* element) {
      list<T*>::iterator it;
      for(it = liste->begin(); it != liste->end(); it++) {
        if(*it == element) {
          return true;
        }
      }
      return false;
    }
    et j'ai la même erreur.

    J'ai modifié la déclaration de l'itérateur par la déclaration suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::_List_iterator<T*> it;
    et là, bingo! ça compile.

    en sachant que
    Citation Envoyé par stl_list.h
    typedef _List_iterator<_Tp> iterator;

    Deux possibilités:
    * soit je m'y suis mal pris dès le début et j'essaye de rafistoler le Titanic avec du papier mâché (je pense que ça doit être ça, mais je sais pas ce que j'ai fait de mal)
    * soit il y a un bug quelque part dans gcc (ce dont je doute )


    Qu'en pensez-vous?

  3. #3
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 263
    Points : 255
    Points
    255
    Par défaut
    Dieu vient de me répondre sur twitter et de m'indiquer un mot clé que je ne connaissais pas:

    typename


    l'initialisation devient donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typename list<Constraint<T>*>::iterator it;

    merci dieu

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

Discussions similaires

  1. Trier une liste de pointeur de class
    Par lolaalol dans le forum C++
    Réponses: 10
    Dernier message: 26/01/2013, 03h42
  2. Réponses: 1
    Dernier message: 25/06/2011, 22h14
  3. classe abstraite avec des methodes manquantes
    Par kkkkkk dans le forum Langage
    Réponses: 6
    Dernier message: 17/10/2007, 15h13
  4. polymorphisme, pointeurs et classes abstraites
    Par legend666 dans le forum C++
    Réponses: 10
    Dernier message: 02/11/2005, 16h44
  5. Réponses: 6
    Dernier message: 27/07/2005, 09h06

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