C++ 模板类型不是";见;由lambda中的编译器执行 模板 void ComputeGenericDropCount(常量函数和函数) { Wcf::ForEach([&](Wcf*Wcf){ Wdb*Wdb=Wdb::Find(wcf->sourceId);//itemCount); }); }
这很奇怪,因为它似乎“看到”C++ 模板类型不是";见;由lambda中的编译器执行 模板 void ComputeGenericDropCount(常量函数和函数) { Wcf::ForEach([&](Wcf*Wcf){ Wdb*Wdb=Wdb::Find(wcf->sourceId);//itemCount); }); },c++,visual-studio,visual-studio-2010,templates,c++11,C++,Visual Studio,Visual Studio 2010,Templates,C++11,这很奇怪,因为它似乎“看到”Wcf没有问题,我甚至使用它:Wcf->itemCount 发生这种情况有什么解决办法或原因吗?不知道为什么不起作用。但这里有一个解决办法 template<typename Wcf, typename Wdb> void ComputeGenericDropCount(const function<void(Wdb *, int)> &func) { Wcf::ForEach([&](Wcf *wcf) {
Wcf
没有问题,我甚至使用它:Wcf->itemCount
发生这种情况有什么解决办法或原因吗?不知道为什么不起作用。但这里有一个解决办法
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);
});
}
模板
void ComputeGenericDropCount(常量函数和函数)
{
auto my_find=Wdb::find;//允许lambda“捕获”正确的函数。
Wcf::ForEach([&](Wcf*Wcf)
{
Wdb*Wdb=my_find(wcf->sourceId);
if(wdb)
func(wdb、wcf->itemCount);
});
}
它识别wcf,因为它是通过引用传递给lambda的参数。不是吗?但是,由于Wdb::Find
似乎是一个公共静态函数,因此没有理由不在lambda的主体中使用它。您能否确认Wdb::Find
是Wdb类的公共静态函数,我是指您实例化模板的函数?我想您应该在microsofts VC2010++论坛上问这个问题,这可能是一个bug。auto my_Find=Wdb::Find我喜欢这个!处理指向成员函数的指针的非常好的方法,而不需要繁重的语法。真不错!谢谢你的提议。
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);
});
}