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