在绑定函数/使用lambdas测试消息传递代码时遇到麻烦
Trouble binding functions/using lambdas to test message-passing code
我确信这是一个简单的错误,但我不明白为什么编译器会这样对我大喊大叫。Signal有一个方法connect,用于指定信号发出时要调用的函数:Signal<Owner, TArgs...>::connect(const Handler& handler);
typedef function<void(const TArgs&...)> Handler;
所有的信号都是这样的:
ndn::util::signal::Signal<Rib, RibRouteRef> beforeRemoveRoute;
我需要做的是测试连接的函数实际接收到的是传递给发出信号的函数的内容。我试图用lambdas来捕获这个并在同一个函数中分析它,但无论我做什么,我都会得到编译器类型转换错误。我尝试使用的代码是:
RibRouteRef routeInfo;
std::function<void (RibRouteRef& rrrIn, RibRouteRef& rrrOut)> signalRec =
[](RibRouteRef& rrrIn, RibRouteRef& rrrOut)
{ rrrOut = rrrIn; };
rib.beforeRemoveRoute.connect(bind(&signalRec, _1, routeInfo));
除非我对bind()的理解非常不正确,否则应该是bind()接受lambda(封装在std::函数中,我认为我不需要),并接受它的两个参数,将一个绑定为routeInfo,另一个是新绑定函数的唯一参数。这个新的有界函数应该是:void (RibRouteRef&)
,对吧?但是,编译器错误是:
../tests/rib/rib.t.cpp:360:33: error: no viable conversion from 'typename _Bind_helper<__is_socketlike<function<void (RibRouteRef &, RibRouteRef &)> *>::value, function<void (RibRouteRef &, RibRouteRef &)> *, const _Placeholder<1> &, RibRouteRef &>::type' (aka '_Bind<std::function<void (nfd::rib::RibRouteRef &, nfd::rib::RibRouteRef &)> *(std::_Placeholder<1>, nfd::rib::RibRouteRef)>')
to 'const Handler' (aka 'const function<void (const nfd::rib::RibRouteRef &)>')
rib.beforeRemoveRoute.connect(bind(&signalRec, _1, routeInfo));
我只是不知道怎么了。有人能指出哪里不对吗?
根据您提供的代码,您的typedef不是一个单独的模板,所以我假设它使用的是TArgs…Signal
模板参数如果这是正确的,那么所有者成为肋骨和目标…变成了基于Signal<>的单一参数RibRouteRef,这与你声明的需要两个RibRouteRef参数的lambda相矛盾。
我不知道它还会破坏什么,但是基于您提供的有限代码,您需要将Signal<>声明为如下内容:
ndn::util::signal::Signal<Rib, RibRouteRef, RibRouteRef> beforeRemoveRoute;
所以Handler类型将包含两个RibRouteRef参数而不是一个。
请注意,它在错误消息中声明了这一点(但以最不可读的方式),指定它不能从您提供的内容进行转换(在这些消息中,跳过typename展开并查看以'aka'开头的别名部分,以表示实际类型),
_Bind<std::function<void (nfd::rib::RibRouteRef &, nfd::rib::RibRouteRef &)> *(std::_Placeholder<1>, nfd::rib::RibRouteRef)>
转换为
的声明类型const Handler
带有扩展别名类型
的const function<void (const nfd::rib::RibRouteRef &)>
因此,它正确地告诉你,它不能将带有两个RibRouteRef参数的lambda转换为只有一个RibRouteRef参数的lambda
- Libmosquitto publish 不会将所有消息传递到 Azure IoT Hub
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- "Guaranteed Delivery"消息传递 - 我应该使用 MQTT 还是 ZeroMQ?
- 核心消息传递中未处理的异常.dll在程序关闭期间
- Microsoft具有本机消息传递和非持久连接的边缘扩展不起作用
- C++参数化构造函数使代码在传递大输入时停止工作
- Firebase C 云消息传递背景问题
- 从客户端到浏览器的CEF中的消息传递序列化
- 我们是否可以使用 FireBase 云消息传递来发送或接收消息,或者在 Windows 桌面/控制台或 Linux 控制
- 如何将WM_KEYDOWN消息传递到 IWebBrowser2 实例
- 如何在 GNU Radio 中实现消息传递
- msgpack:C++和Java之间的消息传递
- 增强ASIO和线程之间的消息传递
- 在C++和Fortran代码之间传递复数数组
- 交流时Chrome本机消息传递错误
- 在托管代码和非托管代码之间传递非托管结构的安全数组
- 多线程C++消息传递
- 跨平台最佳 MVC 模型到控制器消息传递方法(C#、Objective-C++)
- 在绑定函数/使用lambdas测试消息传递代码时遇到麻烦