我是新的使用c ++ 11功能,并尝试使用SDL_Widget-2 lib为我的项目构建一个简单的Gui。但我陷入了这个问题:
#include "sdl-widgets.h"
class Builder
{
public:
Builder():top_win(nullptr)
,but(nullptr)
{
top_win=new TopWin("Hello",Rect(100,100,120,100),0,0,false,
[]() {
top_win->clear();
draw_title_ttf->draw_string(top_win->render,"Hello world!",Point(20,40));
}
);
but=new Button(top_win,0,Rect(5,10,60,0),"catch me",
[](Button *b) {
static int dy=60;
b->hide();
b->move(0,dy);
b->hidden=false;
dy= dy==60 ? -60 : 60;
});
}
private:
TopWin * top_win;
Button *but;
};
int main(int,char**) {
Builder aViewBuilder;
get_events();
return 0;
}
编译阶段出错:
在lambda函数中:
error: 'this' was not captured for this lambda function
error: 'this' was not captured for this lambda function
此错误在控制台中打印两次。 我试过了:
[this](){}
[=](){}
和
[&](){}
具有不同的编译错误,但不能更进一步。 可以看到修复吗?
答案 0 :(得分:3)
您需要使用[this]
或[&]
进行捕获。我怀疑TopWin
和Button
构造函数采用原始函数指针,需要取std::function
s。
普通的vanilla函数指针与捕获lambda不兼容。 std::function
能够像函数指针一样工作,也可以安全存储捕获的数据。 (即当function
对象本身被复制或销毁时,需要正确复制或销毁捕获的对象)