VS.NET 2002, VS.NET 2003 & norme C++

Bon, j’ai un problème que je qualifierai de bizarre, voire même de douteux avec VS.NET 2003, que je n’avais pas avec VS.NET 2002. Je vous explique :

nRay.h(358) : error C2666: ‘CSSEFloat::operator`-’’ : 6 overloads have similar conversions
  CSSEFloat.h(258): could be ‘CHPoint CSSEFloat::operator -(const CHPoint &amp const’
  CSSEFloat.h(250): or ‘CVector CSSEFloat::operator -(const CVector &amp const’
  CSSEFloat.h(242): or ‘CPoint CSSEFloat::operator -(const CPoint &amp const’
  CSSEFloat.h(108): or ‘CSSEFloat CSSEFloat::operator -(const CSSEFloat &amp const’
  CSSEFloat.h(91): or ‘CSSEFloat CSSEFloat::operator -(float)’
  or ‘built-in C++ operator-(float, float)’
  while trying to match the argument list ‘(CSSEFloat, const CSSEFloat)’
  note: qualification adjustment (const/volatile) may be causing the ambiguity

Voila une erreur de compilation qui apparait dans VS.NET 2003, mais qui n’apparait pas dans VS.NET 2002. Le code incriminé est le suivant :

CSSEFloat a = 0;
CSSEFloat b = 1;
CSSEFloat c = 2;
a = b - c;

Et la, je comprends pas pourquoi il n’est pas foutu de comprendre qu’il a affaire à des CSSEFloat de toute part, et que l’opérateur ‘CSSEFloat CSSEFloat::operator -(const CSSEFloat &amp const’ semble de loin le plus indiqué pour réaliser l’opération demandée.

J’ai bien essayé de caster “en dur” en const référence, mais rien n’y fait, il n’arrive pas à lever l’ambiguité. Le même code passait sans aucun soucis sous le 2002.

(petit détail : il existe des opérateurs de cast pour CSSEFloat vers CHPoint, CPoint, CVector & consorts, mais c’est normal, je les utilise aussi, et le compilo devrait bien se rendre compte qu’il n’est question que de CSSEFloat dans mon exemple).

Bref, j’ai l’impression que la prise en charge de la norme C++ a pas mal changée entre le 2002 et le 2003, et ça, ça me chagrine beaucoup beaucoup, parce que je n’ai pas envie de devoir utiliser des immondices comme “a = b.Sub©;” pour remplacer mes jolis opérateurs. Donc si quelqu’un a une idée, je suis preneur

(Pour ceux qui se demandent, CSSEFloat est une classe de gestion d’un seul float, mais stocké dans un registre SSE, qui me permet de faire la passerelle avec mes vecteurs / points / hpoint en SSE eux aussi, et donc d’avoir encore plus d’opérations optimisées SSE tout en écrivant que du C++. Délire.)

Bah le probleme viens de la question : norme et C++… y a pas 2 compilos qui reagissent pareils a rien.
Je connais un moteur 3d qui essaye de passer au c++ pour le haut niveau et les tools chains…
Pour ca on a ecrit une serie de testes de conformances, pour essayer de faire une liste de features communes en utilisant la plus part des compilos classique, et en plusieur version (genre VC6,VC7,VC7.1, ou gcc 2.9.54/gcc 3.0/gcc 3.3) le tout sur plusieur plateformes) : resultat : j’ai jamais vu une liste aussi courte mais surtout fear template, fear operateurs de casts et fear heritage multiple et fear le melange des 3 !!!
Bon courages aux gars qui finiront le moteur en question (j’me comprends… j’me comprends )

Je te comprends aussi, et je vois de quoi tu parles

Moi j’ai en effet des soucis, et pourtant ce que le compilo essaie de résoudre me semble évident, je ne comprends pas en quoi passer d’une instance d’un type à une référence constante sur ce type pourrait introduire une ambiguité (la référence constante étant plus “limitative” que l’instance, il est possible de caster implicitement dans ce sens là, je comprendrais que dans l’autre sens il soit inquiet).

Enfin bref, le C++ c’est bien, très bien, mais les compilos C++… c’est pfiou

Enfin, personne pour m’aider donc

Moi c’est plutot les opérateurs de conversion que je renommerais pour les rendre explicite; plutot que l’opérateur ‘-’

Oui, mais ce n’est qu’un patch, pas une solution

A priori, ça ne le faisait pas avant, donc soit je ne respecte pas la norme (ce qui est possible après tout), soit le VS.NET 2003 est devenu trop strict (ce qui n’est pas non plus impensable). L’un dans l’autre, je préférai quand ça marchait quand même