Lambda d'un lambda: la fonction n'est pas capturé

Le programme suivant ne compile pas :

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
#include <cstdlib>
#include <cmath>

void asort(std::vector<double>& v, std::function<bool(double, double)> f)
{
    std::sort(v.begin(), v.end(), [](double a, double b){return f(std::abs(a), std::abs(b));});
}

int main()
{
    std::vector<double> v({1.2, -1.3, 4.5, 2.3, -10.2, -3.4});
    for (unsigned int i = 0; i < v.size(); ++i) {
        std::cout<<v[i]<<" ";
    }
    std::cout<<std::endl;
    asort(v, [](double a, double b){return a < b;});
    for (unsigned int i = 0; i < v.size(); ++i) {
        std::cout<<v[i]<<" ";
    }
    std::cout<<std::endl;
    return 0;
}

parce que:

error : 'f' is not captured

Que signifie et comment résoudre le problème ?

22
demandé sur Vincent 2012-11-20 00:20:45

2 réponses

Vous utilisez le f paramètre dans le lambda à l'intérieur de asort(), mais vous ne le capturez pas. Essayez d'ajouter f pour la liste de capture (changement [] lire [&f]).

42
répondu cdhowie 2012-11-19 20:22:16

vous référencez effectivement f, qui est une variable dans la portée externe, dans votre lambda. Vous devriez le capturer dans votre liste de capture (le plus simple est probablement par référence [&f], ou [&] pour capturer tout par référence, comme vous l'utilisez immédiatement).

sur une autre note, std:: function a un certain overhead car il effectue l'effacement de type, dans votre cas ici, il pourrait être préférable d'introduire un type de template.

7
répondu wendazhou 2012-11-19 20:24:30