2010-12-01 8 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を認識します。ではない ?しかし、 'Wdb :: Find'はパブリックな静的関数であるように見えるので、ラムダの本体で使われない理由はありません。 'Wdb :: Find'がクラスWdbのパブリック静的関数であることを確認できますか?テンプレートをインスタンス化することを意味しますか? –

+1

私はあなたがマイクロソフトのVC2010 ++フォーラムでこれを尋ねるべきだと思います、それは潜在的にバグかもしれません。 – ronag

答えて

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

'auto my_find = Wdb :: Find;'これが大好きです!重大な構文なしにメンバ関数へのポインタを処理するための本当に良い方法です。すごくいい !提案のためのThanx。 –

関連する問題