2010-11-30 10 views
35

¿Me puede ayudar a resolver este error del compilador?Error del compilador C3493: no se puede capturar implícitamente 'func' porque no se ha especificado ningún modo de captura predeterminado

template<class T> 
static void ComputeGenericDropCount(function<void(Npc *, int)> func) 
{ 
    T::ForEach([](T *what) { 
     Npc *npc = Npc::Find(what->sourceId); 

     if(npc) 
      func(npc, what->itemCount); // <<<<<<< ERROR HERE 
      // Error 1 error C3493: 'func' cannot be implicitly captured because no default capture mode has been specified 

    }); 
} 

static void PreComputeNStar() 
{ 
    // ... 
    ComputeGenericDropCount<DropSkinningNpcCount>([](Npc *npc, int i) { npc->nSkinned += i; }); 
    ComputeGenericDropCount<DropHerbGatheringNpcCount>([](Npc *npc, int i) { npc->nGathered += i; }); 
    ComputeGenericDropCount<DropMiningNpcCount>([](Npc *npc, int i) { npc->nMined += i; }); 
} 

No entiendo por qué me está dando el error y no sé cómo solucionarlo. ComputeGenericDropCount(auto func) tampoco funciona.

+0

Usted puede encontrar este interesante: http://stackoverflow.com/questions/2425277/visual-studio-2010-and-stdfunction –

Respuesta

64

Debe especificar cómo capturar func en la lambda.

[] no captan nada

[&] captura por referencia

[=] captura-por-valor (copia)

T::ForEach([&](T *what) { 

También recomiendo que usted debe enviar func por const referencia.

static void ComputeGenericDropCount(const function<void(Npc *, int)>& func) 
+0

Esto no funciona y me da el mismo error; también pensé que '[]' significa "capturar nada"; '[&]' significa "capturar todos los valores ascendentes por referencia,' [*] 'significa" capturar todos los valores ascendentes por copia ", y así sucesivamente ... Pero creo que esto solo afecta cómo se captan los valores acumulados, es decir, solo afectará el código * inside * the lambda –

+1

Necesitas capturar func para usarlo dentro de la lambda, lo cual haces. No veo cómo podrías obtener el mismo error. Lo intentaré yo mismo cuando llegue a casa. – ronag

+0

¡Lo siento! Agregué el '&' a las lambdas incorrectas, las devoluciones de llamada de 'ComputeGenericDropCount', en lugar de 'ForEach', como dijiste. Ahora todo tiene sentido: ¡necesitaba saber cómo capturar func, por supuesto! Gracias de nuevo –

Cuestiones relacionadas