Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur C2678

Sujet résolu
    21 juillet 2007 à 17:15:35

    Bonjour,

    Je me retrouve confronté à un problème assez génant, qui est l'erreur C2678 du compilateur Visual C++ 2005. Plus précisément :

    Citation : Visual C++

    error C2678: '*' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'const Vector' (ou il n'existe pas de conversion acceptable) - vector.h - 87


    Cela se produit dans une une classe Vector, qui représente un vecteur géométrique, dont voila un extrait :

      Vector operator*(const double coef)
      {
        Vector temp;
        temp.x = x * coef;
        temp.y = y * coef;
        temp.z = z * coef;
        return temp;
      }

      Vector friend operator*(double coef, const Vector& vect)
      {
        return vect * coef;
      }

    L'erreur à lieu sur la seconde fonction. Elle est sensée appeler la première en replacant les opérandes dans le bon sens. Malheureusement... ce n'est pas le cas, le compilateur semble considérer 'const Vector' comme complètement différent de 'Vector'. Certes, je peut enlever la spécification const du paramètre vect, et le code compilera mais ne sera pas au normes.

    N'existerait-il pas, par hasard, un moyen de résoudre le problème en respectant la norme (en laissant le const) et en laissant la première fonction non-amie ? Ou bien peut être qu'une telle écriture n'est pas au normes non plus ? Ou encore Visual C++ fait-il preuve d'un léger bug ? :o

    Merci d'avance. :)
    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2007 à 17:30:02

      Tes signatures sont complexes et pas vraiment bonnes.
      struct V {
          Vector& operator*=(double d) {
             m_x *= d; ....
             return *this;
          }
         ...
      };

      V operator*(V const& lhs, double rhs) {
          return V(lhs) *= rhs;
      }

      V operator*(double lhs, V const& rhs) {
          return V(rhs) *= lhs;
      }


      EDIT: return *this oublié.
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        21 juillet 2007 à 18:04:25

        En effet, procéder aux calculs via le *= fonctionne à merveille et élimine en prime l'infâme variable temp :D , et ce apparament sans temps d'execution supplémentaire, étant donné que le l'appel du constructeur de temp est remplacé dans cette nouvelle solution par l'appel du constructeur de recopie. Et la norme, à vue d'oeil, semble respectée ; aucun warning non plus de VC++ ni de GCC.

        Merci pour cette solution efficace et esthétique :) , j'en garderais trace.
        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2007 à 18:36:37

          Dans le tuto sur les opérateurs, dans les commentaires, tu aurais vu un lien vers ma critique qui donnait la solution canonique de ci-dessus. :p
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

          Erreur C2678

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown