成员方法内部的C ++ 11 Lambda函数继承作用域

| 我编写了一个函数
foreach
,它接受一个lambda函数ala:
void foreach(void (*p)(pNode))
{ /* ... */ }
如果我从主循环中传递了一个lambda函数,它将按预期工作:
int a = 5;
env.N().foreach
(
    [&](pNode n)->void
    {
        n->tps(a); 
    }
);
但是,如果尝试从成员方法中调用相同的函数,则lambda函数“继承”成员函数的作用域并生成编译器错误。例如,如果尝试将其包含在名为
method()
的类
Object
的成员方法中,则会出现以下错误:
error: no matching function for call to ‘IDSet<Node>::foreach(Object::method()::<lambda(pNode)>)’
note: candidate is: void IDSet<T>::foreach(void (*)(IDSet<T>::pT)) [with T = Node, IDSet<T>::pT = pNode]
我意识到这是安全的编译器,因为我可以在lambda函数中包含特定于实例的变量,在这种情况下,需要对lambda进行范围划分,但是我想知道是否有可能制作此lambda \ “静态的\”。 我尝试了
reinterpret_cast
,但是这给了我这个错误:
error: invalid cast from type ‘Object::method()::<lambda(pNode)>’ to type ‘void (*)(pNode)’
[&](pNode ...
之前指定
static
似乎也不是有效的语法。 拼命地,我也尝试将ѭ10更改为
[=]
[]
[a]
,但没有一个起作用。 有谁知道有什么方法可以实现我创建“静态” lambda函数的目标,或者实现该问题可以接受的任何lambda函数? 谢谢! 回答: 在Cat Plus Plus的帮助下,我能够打开错误的代码:
void foreach(void (*p)(pT))
{
    for(pTiter i = _map.begin(); i != _map.end(); i++)
    {
        (*p)(i->second);
    }
}
成完整的功能代码:
void foreach(std::function<void(pT)>(p))
{
    for(pTiter i = _map.begin(); i != _map.end(); i++)
    {
        p(i->second);
    }
}
那确实是我一直想要的。     
已邀请:
        好吧,您不能使用指针。
void foreach(std::function<void(pNode)>);
    

要回复问题请先登录注册