На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> ‘this’ was not captured for this lambda function
    Код такой:
    ExpandedWrap disabled
      void BitOStream::WriteString(std::string str)
      {
          for_each(str.begin(), str.end(), [](char c)
          {
              WriteByte(c);
          }
          );
      }

    Компилятор(g++ 4.5) выдает:
    ExpandedWrap disabled
      BitOStream.cpp: In lambda function:
      BitOStream.cpp:45:3: ошибка: ‘this’ was not captured for this lambda function
      make: *** [flactrim] Ошибка 1

    WriteByte это приватный метод того же класса:
    ExpandedWrap disabled
      void WriteByte(uint8_t byte, unsigned short bitCount = BITSINBYTE);

    Как исправить ошибку?
      Цитата miksayer @
      void BitOStream::WriteString(std::string str) { for_each(str.begin(), str.end(), [this](char c) { WriteByte©; } ); }

      и твой код будет мягким и шелковистым.
        Цитата Flex Ferrum @
        и твой код будет мягким и шелковистым.

        спасибо
        хочу еще посоветоваться. Что лучше в этом случае использовать: лямбда-выражение, как сделано выше или определить еще один вариант функции WriteByte, чтобы она могла принимала char и передавать уже ее?

        Добавлено
        и, кстати, зачем здесь указывать this в квадратных скобках? т.е. мы говорим компилятору, что мы планируем работать с this в самом выражении?
          Цитата miksayer @
          и, кстати, зачем здесь указывать this в квадратных скобках? т.е. мы говорим компилятору, что мы планируем работать с this в самом выражении?

          В квадратных скобках указывается т. н. "capture-list" - перечень переменных, видимых в контексте определения лямбда-функции, который должен быть доступен в её теле. Ты перечисляешь либо конкретные переменные, либо используешь специальные формы:
          [=] - все переменные будут доступны по значению.
          [&] - все переменные будут доступны по ссылке.
          Если оставляешь пустым, то из контекста определения ничего не будет "захвачено".
            спасибо
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0.0631 ]   [ 15 queries used ]   [ Generated: 7.07.26, 10:45 GMT ]