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
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 //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() { }
Et lorsque je tente de compiler, j'obtiens l'erreur suivante:
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; }
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.Envoyé par g++ 4.4.1
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
Partager