Bonsoir,

J'ai un code utilisant des expressions templates pour une classe de vecteurs. L'implémentation n'est pas exactement la même que celle proposée par Laurent Gomila dans son tutoriel, mais le problème que j'ai rencontré se trouve aussi dans l'implémentation proposée par Laurent.

Lors de la définition de mes opérateurs surchargés, j'ai (notation de Laurent) pour la multiplication l'opérateur suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
template <class T>BinaryOp<T, UnaryOp<double, Const>, Mult> operator *(const T& v1, double d)
{
    return MakeMult(v1, MakeConst(d));
}
qui permet de construire un noeud (de l'arbre syntaxique) qui correspond à la multiplication d'un noeud (à gauche) par un nombre (à droite).

En parallèle, j'ai une autre classe qui n'a rien à voir avec les vecteurs précédemment définis mais qui possède elle aussi des opérateurs surchargés. Notamment, un opérateur du type:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
A operator*(const A&, double);
Et c'est là que les problèmes apparaissent. Lorsque j'essaye d'utiliser cet opérateur avec une instance de A, le compilateur (GCC 4.4.1) me dit qu'il y a un conflit et qu'il ne sait pas quelle version choisir entre la version dédiée aux vecteurs et celle spécifique à A.

Je ne peux donc pas avoir en même temps des expressions templates et une autre classe surchargeant des opérateurs ! C'est assez ennuyant.

Auriez-vous une solution à ce problème épineux ?

Merci d'avance !

Nanoc