2014-01-13 3 views
0

Я новичок в использовании функций C++ 11, а также попытаюсь использовать SDL_Widget-2 lib для создания простого Gui для моего проекта. Но я застрял в задаче:C++ 11 Ошибка компиляции функции Lambda

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

с ошибкой на этапе компиляции:

В лямбда-функции:

error: 'this' was not captured for this lambda function 
error: 'this' was not captured for this lambda function 

эта ошибка печатается дважды ИНТ консоли. меня попробовать:

[this](){} 

[=](){} 

и

[&](){} 

с различной ошибки компиляции, но не может идти дальше больше. Можно ли увидеть исправление?

+0

Что такое 'draw_title_ttf'? От куда это? Его не объявлено в классе. – Gasim

+0

- это функция из sdl-widgets lib, которая является оболочкой из sdl2 lib –

ответ

3

Вам необходимо забрать [this] или [&]. Я подозреваю, что конструкторы TopWin3 и Button берут необработанные указатели на функции, и вместо этого нужно взять std::function s.

Указатель простой ванильной функции не совместим с захватом лямбда. std::function способен работать как указатель функции, который также позволяет безопасно хранить захваченные данные. (то есть захваченные объекты должны быть надлежащим образом скопированы или уничтожены, когда объект function сам будет скопирован или уничтожен)

Смежные вопросы