Bonjour a tous,
merci à ceux qui liront et essayerons de m'aider.
Je me confronte a un probleme bien tordu qui releve surement d'un probleme de Design de mon code mais je trouve aucune solution valable la.
Voici le code (simplifié car je ne peux pas copier le code original qui est privé):
Donc, on a une classe abstraite mere Addition et la classe AdditionValue qui permet de templétisé l'opération Addition suivant le type des données.
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 class Addition: public IOperation { public: virtual ~Addition(){} //void DoOperation(Value a, Value b) const = 0; }; //! Typedef typedef boost::shared_ptr<const Addition> AdditionConstPtr; /*! Templated Implementation */ template<typename Value> class AdditionValue: public Addition, public OperationValue<Value> { public: AdditionValue(); void DoOperation(Value a, Value b); protected: //! Typedef typedef boost::shared_ptr<const AdditionValue<Value> > AdditionValueConstPtr; private: Value m_AdditionResult; }
Ensuite dans le code on a une autre classe qui a un membre de type AdditionValue templétisée aussi:
et donc mon problème vient au moment ou dans mon code j'ai instancié un CheckOperation et je veux faire la chose 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 template <typename Value> class CheckOperationValue: public CheckOperation { //! Typedef typedef boost::shared_ptr<const AdditionValue<Value> > AdditionValueConstPtr; //! Accessors AdditionConstPtr getAddition() const final; private: mutable AdditionConstPtr m_AdditionCPtr; } template<typename Value> AdditionConstPtr CheckOperationValue<Value>::getAddition() const { if (! m_AdditionCPtr) { build_addition(); } return m_AdditionCPtr; } template<typename Value> void CheckOperationValue<Value>::build_addition() const { // build Addition operator m_AdditionCPtr = AdditionValueConstPtr(boost::make_shared<AdditionValue<Value> >())); }
En effet, on a un pointeur sur la classe de base Addition (non templétisé) qui utilise une fonction membre de la classe templétisé AdditionValue, et donc je ne peux pas définir cette fonction dans la classe de base car pas de template. Si je crée la classe de base comme template, j'ai ensuite un autre problème du meme genre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 double a, b; ... auto checkOPCPtr = ...; auto addOPCPtr = checkOPCPtr->getAddition(); addOPCPtr->DoOperation(a,b)
C'est assez compliqué et j'espere que mon exemple qui n'a aucun sens reprend bien le probleme dans mon contexte.
Merci de vos conseils en avance !!!
Partager