c++ - 使用 std::for_each lambda 函数时出错

标签 c++ boost c++11 wt

我有一个小问题,我不明白为什么这段代码不起作用:

std::for_each(users.begin(), users.end(), [](Wt::WString u)
{
    std::cout << "ilosc: " << users.size() << std::endl;
    userBox_->addItem(u);
});

编译时遇到的错误:

GameWidget.cpp: In lambda function:
GameWidget.cpp:352:30: error: 'users' is not captured
GameWidget.cpp:353:4: error: 'this' was not captured for this lambda function
GameWidget.cpp: In member function 'virtual void GameWidget::updateUsers()':
GameWidget.cpp:354:3: warning: lambda expressions only available with -std=c++11 or -std=gnu++11 [enabled by default]
GameWidget.cpp:354:4: error: no matching function for call to 'for_each(std::set<Wt::WString>::iterator, std::set<Wt::WString>::iterator, GameWidget::updateUsers()::<lambda(Wt::WString)>)'
GameWidget.cpp:354:4: note: candidate is:
In file included from /usr/include/c++/4.7/algorithm:63:0,
                 from GameWidget.h:11,
                 from GameWidget.cpp:9:
/usr/include/c++/4.7/bits/stl_algo.h:4436:5: note: template<class _IIter, class _Funct> _Funct std::for_each(_IIter, _IIter, _Funct)
GameWidget.cpp:354:4: error: template argument for 'template<class _IIter, class _Funct> _Funct std::for_each(_IIter, _IIter, _Funct)' uses local type 'GameWidget::updateUsers()::<lambda(Wt::WString)>'
GameWidget.cpp:354:4: error:   trying to instantiate 'template<class _IIter, class _Funct> _Funct std::for_each(_IIter, _IIter, _Funct)'

我正在使用 gcc 4.7.3,所以我的编译器可能支持 C++11。

userBox_ 是一个集合,BOOST_FOREACH 适用于此代码:

BOOST_FOREACH(Wt::WString i, users)
{
    std::cout << "ilosc: " << users.size() << std::endl;
    userBox_->addItem(i);
}

感谢您的回答,我很好奇这是为什么。

最佳答案

您编写的 lambda 不捕获任何上下文变量。为此,最简单的方法是将 & 添加到 lambda 的捕获列表中。这将通过引用捕获所有上下文变量,您将能够在 lambda 中访问它们。

std::for_each(users.begin(), users.end(), [&](Wt::WString u)
{
    std::cout << "ilosc: " << users.size() << std::endl;
    userBox_->addItem(u);
});

我不明白为什么要在循环中打印 users.size(),因为看起来每次迭代的输出都是一样的。如果您将其移出循环,并希望对 lambda 捕获的内容进行更细粒度的控制,您可以修改捕获列表以仅捕获 this 指针。这将允许您访问成员变量 userBox_

std::cout << "ilosc: " << users.size() << std::endl;
std::for_each(users.begin(), users.end(), [this](Wt::WString u)
{
    userBox_->addItem(u);
});

MSDN 有一篇很好的文章解释了 lambda expression syntax非常详细。

最后,在您的情况下,不需要 std::for_each 和 lambda。使用基于范围的 for 循环将项目添加到集合中会更加简洁。

for( auto const& u: users ) {
  userBox_->addItem(u);
}

关于c++ - 使用 std::for_each lambda 函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16763823/

相关文章:

python - Boost Python Exposing C++ class with constructor taking a std::list

c++ - Boost.Log 'max_files' 配置未应用

c++ - 使用 `std::greater` 通过 `priority_queue` 创建最小堆的原因

c++ - Lambda 捕获和成员变量

c++ - LEA 指令 "=> 0xb48daed9 <+3479>: lea -0xc(%ebp),%esp"的意义是什么?

c++ - Google 如何处理 C++ 中的错误

c++ - 使用Google Test对自定义Assert函数进行单元测试

c++ - 使用 Boost.Python 和静态库构建

c++ - 带有 std::future 的 VS 11 - 这是一个错误吗?

c++ - AMD GPU 的 OpenCL 时间测量问题