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