2010-11-30 9 views
35

Bu derleyici hatasını çözmeme yardımcı olabilir misiniz?Derleyici hatası C3493: 'func' varsayılan yakalama modu belirtilmediğinden örtülü olarak yakalanamıyor

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

Neden bana hata verdiğini anlayamıyorum ve nasıl düzeltileceğini bilmiyorum. ComputeGenericDropCount(auto func) da çalışmıyor.

+0

Sen bulabilir bu ilginç: http://stackoverflow.com/questions/2425277/visual-studio-2010-and-stdfunction –

cevap

64

Lambda'nın içine func nasıl çekileceğini belirtmeniz gerekir.

[] için herşeyi yakalamak yok

[&] yakalama referans-ile-

[=] yakalama değer-ile-(kopya) Eğer func göndermesi gerektiğini

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

Ben de tavsiye ederim const başvuru ile.

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

Bu işe yaramazsa ve bana aynı hata veriyor; Ayrıca, “[]' '' '' '' '' '' • '' hiçbir şeyi yakalama '' anlamına gelir; "[&]", "tüm upvaldeları referans alarak yakala" anlamına gelir, [*] '" tüm upvaldeları kopyalayarak yakala "anlamına gelir, vb .. Ama bence bu sadece up değerlerin nasıl yakalandığını etkiler, yani sadece kodu etkiler * içinde * lambda –

+1

Eğer lambda içinde kullanmak için sırayla func yakalamanız gerekir. Nasıl aynı hata nasıl alabilirsiniz göremiyorum. Ben eve geldiğimde kendim deneyeceğim. – ronag

+0

Özür dilerim, yanlış lambdalara, "CompEnGenericDropCount" yerine "ForEach" yerine geri çağrılar ekledim. Şimdi her şey mantıklı geliyor: func'u nasıl yakalayacağımızı bilmek gerekiyor elbette !! Tekrar teşekkürler –

İlgili konular