“ошибка: захват не переменной” при использовании лямбда-выражения в классе

#c

#c

Вопрос:

У меня есть рабочий класс c , который имеет файл заголовка и файл cpp, где следующие строки находятся в одной из функций этого класса в файле cpp:

 the robot(robot_ip);
   services
        .advertiseService<franka_control::SetJointImpedance>(node_handle, "set_joint_impedance",
            [amp;robot](autoamp;amp; req, autoamp;amp; res) { return franka_control::setJointImpedance(robot, req, res); });
  

Теперь я переместил первую строку выше, franka::Robot robot{robot_ip}; , в файл заголовка этого класса вместо этого, потому что я хочу иметь возможность ссылаться robot также на другие функции этого класса. Однако теперь я получаю ошибку:

 error: capture of non-variable ‘CLass::robot’ 
             [amp;robot](autoamp;amp; req) { return sometype(robot, req, res); });
               ^~~~~
  

Ответ №1:

Вы можете захватывать только локальные переменные в лямбда-функцию, потому что в противном случае эти переменные не будут доступны для этой функции — вы можете рассматривать эту функцию как автономную функцию с дополнительными данными.

Но после того, как ваше изменение robot стало глобальной переменной, оно доступно внутри лямбда-функции точно так же, как доступно для любой другой функции — вам не нужно захватывать его, чтобы использовать (и дело не только в том, что вам не нужно — вам не разрешено).

Комментарии:

1. Это означает, что я должен написать [](auto amp;amp; req, auto amp;amp; res) … или [это](autoamp;amp; req, autoamp;amp; res) { возвращает franka_control::setJointImpedance(robot, req, res); }); ?

2. Я заметил новую проблему, для решения которой мне на самом деле приходится использовать std::unique_ptr<franka::Robot> robot; в заголовке и robot = std ::make_unique<franka::Robot>(robot_ip); в cpp, но понятия не имею, как мне следует изменить две другие строки ниже services…

3. Я не понимаю новый вопрос… Если в заголовке есть std::unique_ptr<franka::Robot> robot , то вы можете просто использовать его в lambda, вам не нужно его захватывать.