从返回绑定中获取函数失败
get function from returning of bind failed
我试图从 std::bind 的结果中获取一个 std::function。 但是当我尝试编译下面的代码时出现错误,其中data_struct_call_ptr和tracking_call_ptr指向两个资源池,这两个资源池重载了它们的 () 运算符,使它们成为可调用的对象。 但是它们无法复制,所以我在这里使用 std::ref 来包装它们。
我应该能够将ve_ptr传输到异步执行的 lambda。但是,我在开始时遇到编译错误。
代码和编译错误如下。 任何帮助将不胜感激。
Error VSEService::TaskNew(const NewTaskRequest* req, NewTaskResponse* resp) {
shared_ptr<::Config> conf(Config::CreateInstance(-1, -1));
shared_ptr<FrameCallType> data_struct_call_ptr = make_shared<FrameCallType>();
shared_ptr<TrackCallType> tracking_call_ptr = make_shared<TrackCallType>();
std::function<void(ObjPtrWithFramePtr)> dc = ref(*data_struct_call_ptr);
std::function<void(FramePtr)> fc = ref(*tracking_call_ptr);
std::promise<bool> initialized_promise;
std::future<bool> initialized = initialized_promise.get_future();
shared_ptr<VideoEngine> ve = nullptr;
shared_ptr<VideoEngine*> ve_ptr = make_shared<VideoEngine*>(nullptr);
shared_ptr<tbb_app> app = nullptr;
Config* raw_conf = conf.get();
std::function<DGStatus(DGFrame)> pushcall = bind([](DGFrame f, std::function<void(ObjPtrWithFramePtr)>&& _dc,
std::function<void(FramePtr)>&& _fc,
shared_ptr<VideoEngine*> _ve_ptr,
std::promise<bool>&& _initialized_promise,
::Config* _raw_conf) -> DGStatus {
if (*_ve_ptr == nullptr) {
*_ve_ptr = VideoEngine::NewVideoEngineFromConfPtr(_raw_conf, f.w, f.h, _dc, _fc);
_initialized_promise.set_value(true);
}
(*_ve_ptr)->PushFrame(f);
}, std::placeholders::_1, std::move(dc), std::move(fc), ve_ptr, std::move(initialized_promise), raw_conf);
std::shared_ptr<std::function<DGStatus(DGFrame)>> pushcall_ptr = make_shared<std::function<DGStatus(DGFrame)>>(std::move(pushcall));
编译错误令人困惑。为什么不能将绑定结果转换为函数?
/home/deepglint/code/dgstream/src/services/vse_service.cpp: In member function ‘Error VSEService::TaskNew(const dgvse::NewTaskRequest*, dgvse::NewTaskResponse*)’:
/home/deepglint/code/dgstream/src/services/vse_service.cpp:99:109: error: conversion from ‘std::_Bind_helper<false, VSEService::TaskNew(const dgvse::NewTaskRequest*, dgvse::NewTaskResponse*)::__lambda13, const std::_Placeholder<1>&, std::function<void(ObjPtrWithFramePtr)>, std::function<void(std::shared_ptr<ObjFrame>)>, std::shared_ptr<VideoEngine*>&, std::promise<bool>, Config*&>::type {aka std::_Bind<VSEService::TaskNew(const dgvse::NewTaskRequest*, dgvse::NewTaskResponse*)::__lambda13(std::_Placeholder<1>, std::function<void(ObjPtrWithFramePtr)>, std::function<void(std::shared_ptr<ObjFrame>)>, std::shared_ptr<VideoEngine*>, std::promise<bool>, Config*)>}’ to non-scalar type ‘std::function<DGStatus(DGFrame)>’ requested
}, std::placeholders::_1, std::move(dc), std::move(fc), ve_ptr, std::move(initialized_promise), raw_conf);
^
make[2]: *** [src/CMakeFiles/dgstream.dir/services/vse_service.cpp.o] 错误 1
make[1]: *** [src/CMakeFiles/dgstream.dir/all] 错误 2
make: *** [all] 错误 2
看起来你不需要在那里绑定任何东西。
您可以尝试完全删除绑定,并指定您希望如何在捕获子句 [] 中捕获参数,例如[&dc, &fc, ve_ptr...]
,并调整 lambda 参数以匹配所需的签名。
相关文章:
- 函数返回时,带指针的复制构造函数失败
- 为什么 std::get<T> 其中 T 是调用 constexpr 函数失败的结果?
- 在 if 语句中调用重载构造函数失败
- 使用特征函数失败
- 为什么通过通用引用运算符 (&&) 将变量的引用传递给 Varadic 模板函数失败?
- 为什么我的代码在没有 chroot 函数的情况下工作,但使用 chroot 函数失败?
- 非常量调用 const 成员函数失败,只读位置C++
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- C++模板化类默认构造函数失败
- STD :: MAP EMPLECE通过显式构造函数失败
- 为什么 std::apply 使用泛型函数失败
- 从返回绑定中获取函数失败
- 运算符 == 重载函数失败
- 打开不存在的文件时如何使流构造函数失败?
- 为线程构造函数传递引用以将其绑定到函数失败
- 显式DLL 1函数失败
- 模板参数扣除/替换使用Lambda表达式使用高阶函数失败
- 来自(QT)插件的调用函数失败
- 什么错误的逻辑导致我的链表的这个 push_back(..) 函数失败?
- 复制构造函数失败..重载,动态分配