4

少し問題があり、このコードが機能しない理由がわかりません。

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

答えてくれてありがとう、私はそれがなぜなのかとても興味があります。

4

3 に答える 3

1

知っておくべきことはすべて、受け取ったエラーに含まれています。

「[]」を使用して、何もキャプチャしないように明示的にラムダに指示しました。これは、関数本体内でアクセスできる唯一の変数がパラメーターとグローバルであることを意味します。

userBox_ の型は関係ありません。これはメンバー変数であるため、ラムダは「これ」をキャプチャする必要があります。

最後に、値で渡します。つまり、Wt::WString をすべて複製することになります。代わりに使用したい場合があります

std::for_each(users.begin(), users.end(), [&](const Wt::WString& u) {
...
});

「&」は参照によってキャプチャし、「this」をキャプチャします。

http://en.cppreference.com/w/cpp/language/lambda

于 2013-05-26T21:40:41.777 に答える
0

変数 users をキャプチャするということは、ラムダを次のように宣言することを意味します。

    [users](Wt::WString u){...}

usersこれは読み取り専用変数として渡されます。

を変更できるようにするusersには、ラムダを次のように宣言する必要があります。

    [&users](Wt::WString u){...}
于 2013-05-26T21:34:11.503 に答える