2010-11-30 9 views
35

Können Sie mir helfen, diesen Compilerfehler zu beheben?Compiler-Fehler C3493: 'func' kann nicht implizit erfasst werden, da kein Standard-Capture-Modus angegeben wurde

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; }); 
} 

Ich kann nicht verstehen, warum es mir den Fehler gibt und ich weiß nicht, wie man es repariert. ComputeGenericDropCount(auto func) funktioniert auch nicht.

+0

Sie können dies interessant finden: http://stackoverflow.com/questions/2425277/visual-studio-2010-and-stdfunction –

Antwort

64

Sie müssen festlegen, wie in das Lambda func erfasst wird.

[] erfassen nichts

[&] Capture-by-reference

[=] Capture-by-Wert (Kopie)

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

ich auch, dass Sie sollten func senden würde empfehlen durch const Referenz.

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

Dies funktioniert nicht und gibt mir den gleichen Fehler; Ich dachte auch, dass '[]' bedeutet "nimm nichts"; '[&]' bedeutet "erfasse alle Upvalues ​​per Referenz,' [*] 'bedeutet" Capture upvalues ​​by copy ", usw. Aber ich denke, dies beeinflusst nur, wie upvalues ​​erfasst werden, dh es betrifft nur Code * inside * das Lambda –

+1

Sie müssen func in der Reihenfolge erfassen, um es innerhalb des Lambda zu verwenden, was Sie tun. Ich sehe nicht, wie Sie den gleichen Fehler bekommen konnten. Ich werde es selbst versuchen, sobald ich nachhause komme. – ronag

+0

Entschuldigung! Ich habe die '&' zu den falschen lambdas hinzugefügt, die Callbacks von 'ComputeGenericDropCount' anstelle von' ForEach', wie du sagtest. Jetzt macht alles Sinn: es musste natürlich wissen wie man func erfasst !! Danke nochmal . –

Verwandte Themen