Partage
  • Partager sur Facebook
  • Partager sur Twitter

std::inner_product, op2 custom.

Sujet résolu
    23 mars 2019 à 9:51:26

    Bonjour,

    Ce code compile :

    double Polyline::length(std::vector<Point>::const_iterator first,
                            std::vector<Point>::const_iterator last) const
    {
        auto func = [](Point const& ptA, Point const& ptB) ->
                double {return Point::distance(ptA, ptB);};
        return inner_product(first, last-1, first+1, 0,
                             plus<double>(), func);
    }

    et celui-ci ne compile pas :

    double Polyline::length(std::vector<Point>::const_iterator first,
                            std::vector<Point>::const_iterator last) const
    {
        return inner_product(first, last-1, first+1, 0,
                             plus<double>(), Point::distance);
    }

    raison : « no matching for call to ’inner_product’.

    La fonction distance prends deux Points en paramètres et retourne un double, tout comme func.

    Dans l'absolu, ce n'est pas un problème, je peux passer par ma lambda. Mais je suis tout de même curieux de connaître l'explication à ce mystère.

    Merci.


    • Partager sur Facebook
    • Partager sur Twitter
      23 mars 2019 à 10:15:02

      Il faut passer l'adresse de la fonction:
      double Polyline::length(std::vector<Point>::const_iterator first,
                              std::vector<Point>::const_iterator last) const
      {
          return inner_product(first, last-1, first+1, 0,
                               plus<double>(), &Point::distance);
      }
      • Partager sur Facebook
      • Partager sur Twitter
      Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
        23 mars 2019 à 10:28:42

        Merci, mais ça donne le même message d'erreur.

        Et puis dans ce cas, il aurait aussi fallut mettre &func dans le premier exemple non ?

        • Partager sur Facebook
        • Partager sur Twitter
          23 mars 2019 à 10:39:30

          Tu peux faire voir la déclaration de distance ?

          • Partager sur Facebook
          • Partager sur Twitter

          Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

            23 mars 2019 à 11:11:10

            Ok, je crois que j'ai compris :

            class Point
            {
                public:
            //[…]
                    double distance(Point const&) const;
                    static double distance(Point const&, Point const&);
            //[…]
            
            };
            

            En fait si je commente la première surcharge de distance, ça fonctionne. Donc il semblerait qu'en l'absence de paramètre, le compilo ne sache pas faire le lien entre le prototype de inner_product et celui de distance.

            Est-ce qu'il existe un moyen d'expliciter la surcharge à passer en callback ?

            • Partager sur Facebook
            • Partager sur Twitter
              23 mars 2019 à 11:56:42

              std::mem_fn.

              Après il y a d'autres cas où un cast est obligatoire et il est préférable d'utiliser une lambda.

              • Partager sur Facebook
              • Partager sur Twitter
                23 mars 2019 à 14:40:03

                Ça marche, je vais rester sur la solution de la lambda du coup.

                Merci de vos réponses.

                • Partager sur Facebook
                • Partager sur Twitter

                std::inner_product, op2 custom.

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown