2010-12-01 41 views
2
template<typename Wcf, typename Wdb> 
void ComputeGenericDropCount(const function<void(Wdb *, int)> &func) 
{ 
    Wcf::ForEach([&](Wcf *wcf) { 
     Wdb *wdb = Wdb::Find(wcf->sourceId); // <--- ERROR 
      // error C2653: 'Wdb' : is not a class or namespace name 


     if(wdb) 
      func(wdb, wcf->itemCount); 
    }); 
} 

這很奇怪,因爲它似乎「看」 Wcf沒有問題裏面,我甚至用它:wcf->itemCount模板類型不是「看到」由編譯器拉姆達

是否有任何解決方法或原因,爲什麼發生這種情況?

+0

它會識別wcf,因爲它是通過引用傳遞給您的lambda的參數。不是嗎?然而,由於`Wdb :: Find`似乎是一個公共的靜態函數,它沒有看到任何理由不能在lambda體中使用。你能否確認`Wdb :: Find`是類Wdb的一個公共靜態函數,我的意思是你實例化你的模板的那個? – 2010-12-01 16:59:33

+1

我想你應該在微軟VC2010 ++論壇上提出這個問題,它可能是一個bug。 – ronag 2010-12-01 17:07:52

回答

3

不知道爲什麼它不起作用。但是,這是一個解決方法。

template<typename Wcf, typename Wdb> 
void ComputeGenericDropCount(const function<void(Wdb *, int)> &func) 
{ 
    auto my_find = Wdb::Find; // allows lambda to "capture" the correct function. 
    Wcf::ForEach([&](Wcf *wcf) 
    { 
     Wdb *wdb = my_find(wcf->sourceId);  

     if(wdb) 
      func(wdb, wcf->itemCount); 
    }); 
}