IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Lambda fonction : problème de compilation


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 72
    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 Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 507
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 72
    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, 16h28
  2. Fonction avec 3 paramètre > problème de compilation
    Par arnaudperfect dans le forum C
    Réponses: 2
    Dernier message: 04/01/2008, 16h49
  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, 12h35
  4. Problème de compilation: fonction introuvable
    Par Bornerdogge dans le forum Ogre
    Réponses: 18
    Dernier message: 02/02/2007, 22h40
  5. Réponses: 7
    Dernier message: 12/11/2006, 13h49

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