Лямбда-функция не компилируется с другой сигнатурой - PullRequest
0 голосов
/ 13 мая 2018

Я пробую лямбда-функции c ++:

Это работает:

std::function<std::string(std::string)>lambda = [] (std::string message) -> std::string
   {
       return std::string("test");
   };

я могу вызвать функцию с помощью std::cout << lambda(std::string("in"));, и она печатает "test".

однако, если я передам другой тип (std::istream), он не скомпилируется. Отображение из std::istream в любой тип, например, string, должно быть конечной целью. Я собираюсь использовать шаблоны для этой цели. :

std::function<std::string(std::istream)>lambda = [] (std::istream message) -> std::string
   {
       return std::string("test");
   };

Это вывод из g ++:

g++ -I"/home/***/workspace.cpp/unrealcv-renderer/include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/unrealcv_renderer.d" -MT"src/unrealcv_renderer.o" -o "src/unrealcv_renderer.o" "../src/unrealcv_renderer.cpp"
../src/unrealcv_renderer.cpp: In constructor ‘event_camera_simulator::UnrealCVRenderer::UnrealCVRenderer(std::__cxx11::string, std::__cxx11::string)’:
../src/unrealcv_renderer.cpp:23:8: error: conversion from ‘event_camera_simulator::UnrealCVRenderer::UnrealCVRenderer(std::__cxx11::string, std::__cxx11::string)::<lambda(std::istream)>’ to non-scalar type ‘std::function<std::__cxx11::basic_string<char>(std::basic_istream<char>)>’ requested
        };
        ^

Что вызывает здесь проблемы?

1 Ответ

0 голосов
/ 13 мая 2018

Проблема заключается в том, что вы передаете std::istream по значению, что, возможно, требует копии, и это класс, не поддерживающий копирование .

Возможное решение - принять по ссылке:

std::function<std::string(std::istream&)>lambda = [] (std::istream& message) -> std::string
   {
       return std::string("test");
   };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...