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é):

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;
}
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.

Ensuite dans le code on a une autre classe qui a un membre de type AdditionValue templétisée aussi:

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> >()));
}
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
 
 
double a, b;
 
...
 
auto checkOPCPtr = ...;
auto addOPCPtr = checkOPCPtr->getAddition();
addOPCPtr->DoOperation(a,b)
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.

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