1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2012
    Messages : 38
    Points : 33
    Points
    33

    Par défaut Lambda fonction : problème de compilation

    Bonjour

    Le programme suivant compile et fonctionne correctement

    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
     
    // Quelques" #include" inutiles, sans aucun doute !
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <iomanip>
    #include <cmath>
    #include <Windows.h>
    #include <cstdlib>
     
     
    using namespace std;
     
     
    void fmap( int (*f)(int ) )
    {
        for(int i = 1; i < 10; ++i){ cout<<f(i)<<", "; }
    }
     
     
    int main()
    {
     
        auto m_f = [](int x){ return 3*x; };
     
        for(int i = 1; i < 10; ++i){ cout<<m_f(i)<<", "; }
        cout<<"\n -----\n";
        fmap(m_f);
     
        return 0;
    }
    Avec ce main() là 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
     
     
     
    int main()
    {
         int a = 3;
         auto m_f = [a](int x){ return a*x; };
     
         for(int i = 1; i < 10; ++i){ cout<<m_f(i)<<", "; }
         cout<<"\n -----\n";
    //   fmap(m_f);
     
        return 0;
    }
    Mais si on décommente la ligne 11, il ne compile plus
    Le message d'erreur est
    error: cannot convert 'main()::<lambda(int)>' to 'int (*)(int)' for argument '1' to 'void fmap(int (*)(int))'
    Merci d'éclairer ma lanterne

    PS : Windows seven + CodeBlocks + TDM64-GCC Compiler

  2. #2
    Membre expérimenté
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 365
    Points : 1 591
    Points
    1 591

    Par défaut

    Bonjour,

    Une lambda n'est convertible en pointeur de fonction que si elle ne capture rien.
    Or, dans ton deuxième code, ta lambda capture a.
    La solution est d'utiliser std::function qui est plus flexible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <iostream>
    #include <functional>
    void fmap(std::function<int(int)> f)
    {
        for(int i = 1; i < 10; ++i){ std::cout<<f(i)<<", "; }
    }
    Documentation de std::function : http://en.cppreference.com/w/cpp/uti...ional/function
    Documentation des lambdas : http://en.cppreference.com/w/cpp/language/lambda
    -> En particulier, voir le paragraphe ClosureType::operator ret(*)(params)() qui concerne la conversion en pointeur de fonction.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2012
    Messages : 38
    Points : 33
    Points
    33

    Par défaut

    Merci beaucoup pour cette réponse rapide

    Une lambda n'est convertible en pointeur de fonction que si elle ne capture rien.
    Voilà qui éclaire tout !

    Je vais suivre les liens que tu m'as indiqués et essayer de digérer tout çà

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de compilation d'une fonction
    Par amine1980 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 28/11/2008, 15h28
  2. Fonction avec 3 paramètre > problème de compilation
    Par arnaudperfect dans le forum C
    Réponses: 2
    Dernier message: 04/01/2008, 15h49
  3. problème de compilation de la fonction droite
    Par dimdoom dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 21/06/2007, 11h35
  4. Problème de compilation: fonction introuvable
    Par Bornerdogge dans le forum Ogre
    Réponses: 18
    Dernier message: 02/02/2007, 21h40
  5. Réponses: 7
    Dernier message: 12/11/2006, 12h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo