相关疑难解决方法(0)

嵌套的Lambda捕获问题

我使用Visual Studio 2010编译器编译了它,它在嵌套的lambda上有编译器错误问题,捕获第一个lambda已捕获的变量:

    Functor& fn, const WorkData& workData

    group.run([&fn, workData](){
    async_future<ProcessorResult> future([&fn, workData]() -> ProcessorResult{
    ProcessorResult result = fn.Process(workData);

    return result;
    });
});
Run Code Online (Sandbox Code Playgroud)

我明白了:

**error C3480**: '`anonymous-namespace'::<lambda3>::fn': a lambda capture variable must be from an enclosing function scope
Run Code Online (Sandbox Code Playgroud)

似乎编译器不喜欢我尝试在未来实例中捕获group.run()方法已捕获的变量.

如果我创建本地副本,它可以工作:

    group.run([&fn, workData](){
    Functor& fnlocal = fn;
    WorkData workDatalocal = workData;

    async_future<ProcessorResult> future([&fnlocal, workDatalocal]() -> ProcessorResult{
    ProcessorResult result = fnlocal.Process(workDatalocal);

    return result;
    });
});
Run Code Online (Sandbox Code Playgroud)

这种行为符合吗?我总是需要复制捕获的变量,以便在嵌套的lambda上捕获相同的变量?

c++ lambda visual-studio-2010 visual-studio c++11

12
推荐指数
1
解决办法
3254
查看次数

在lambda体内重载的静态成员函数调用不能编译

所以基本上这里是我的代码的简化版本,无法编译:

class MyClass
{
    static void foo(X)
    {
        //do something
    }

    static void foo(Y)
    {
        //do something
    }

    static void bar()
    {
        std::for_each(collection->begin(), collection->end(),
          [&](X& elem)
        {
          foo(elem); //this call generates the error
        });
    }   
};
Run Code Online (Sandbox Code Playgroud)

编译器:安装了SP1的MSVC 2010它生成的错误消息是:错误C3861:'foo':找不到标识符

如果我重命名foo()函数,或者我在lambda之外调用它,则不会发生错误.

更新:

我设法通过明确限定foo()来解决这个问题.有趣的是:: MyClass :: foo(elem)可以工作,但MyClass :: foo(elem)不能.

c++ lambda static-methods visual-studio-2010 c++11

3
推荐指数
1
解决办法
424
查看次数