我确定这是一个简单的错误,但我无法理解为什么编译器会这样对我大喊大叫。 Signal有一个方法connect,用于指定发出信号时要调用的函数:
Signal<Owner, TArgs...>::connect(const Handler& handler);
反过来,Handler只是函数的typedef:
typedef function<void(const TArgs&...)> Handler;
所有信号都是这样的:
ndn::util::signal::Signal<Rib, RibRouteRef> beforeRemoveRoute;
我需要做的是测试连接函数实际接收的是传递给发出Signal的函数的内容。我正在尝试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 :: function中,我不认为我需要) ,并获取其两个参数,将一个绑定到alwaysInfo,另一个是新绑定函数的唯一参数。这个新的绑定函数应该具有以下标记: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));
我只是不知道出了什么问题。谁能指出出了什么问题?
答案 0 :(得分:0)
你的typedef不是基于你提供的代码的单独模板,所以我假设它使用了Signal的TArgs ...模板参数
如果这是正确的,则所有者变为Rib并且TArgs ...基于您的Signal&lt;&gt;成为单个参数RibRouteRef,这与您需要两个RibRouteRef参数的lambda声明相矛盾。
我不知道它会破坏什么,但根据您提供的有限代码,您需要声明您的信号&lt;&gt;就像这样:
ndn::util::signal::Signal<Rib, RibRouteRef, RibRouteRef> beforeRemoveRoute;
因此Handler类型将包含两个RibRouteRef参数,而不仅仅是一个。
请注意它在错误消息中说明了这一点(但是以最难以理解的方式),指定它无法从您提供的内容进行转换(在这些消息中,跳过typename扩展并查看以&#39开头的别名部分;又名&#39;为真实类型),
_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。