如果我能做到以下几点会很好:
template <class RT, class... PT>
class Event
{
...
void operator()(PT... args)
{
std::for_each(
l.begin(), l.end(), [args...](Handler *p) { (*p)(args...); }
);
}
...
};
不幸的是我无法使用g ++ 4.7.2(-std = c ++ 0x)进行编译:
evtempl.hh:在成员函数'void elt :: Event :: operator()(PT ...)'中: evtempl.hh:75:54:错误:预期','在'...'标记之前 evtempl.hh:75:54:错误:'...'标记之前的预期标识符 evtempl.hh:75:57:错误:参数包未使用“...”扩展: evtempl.hh:75:57:注意:'args' evtempl.hh:在lambda函数中: evtempl.hh:76:26:错误:扩展模式'args'不包含参数包 evtempl.hh:在'void elt :: Event :: operator()(PT ...)的实例化中[RT = void; PT = {int}]': testevtempl.cc:28:9:从这里要求 evtempl.hh:74:9:错误:使用无效字段'elt :: Event :: operator()(PT ...):::: Handler *)&gt; :: __ args' evtempl.hh:在'void elt :: Event :: operator()(PT ...)的实例化中[RT = void; PT = {int,const char *}]': testevtempl.cc:29:20:从这里要求 evtempl.hh:74:9:错误:使用无效字段'elt :: Event :: operator()(PT ...):::: Handler *)&gt; :: __ args'
相反,我必须将lambda更改为旧的,平凡的语法:
for (itr = l.begin(); itr != l.end(); ++itr)
(*(*itr))(args...);
这个编译并正常工作。
我想知道为什么lambda语法不起作用。
我试过
[=](Handler *p) { (*p)(args...); }
它会产生与您相同的错误:
[args](Handler *p) { (*p)(args...); }
抱怨参数包未展开
答案 0 :(得分:6)