Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;Lambda分段断层_C++_Reference_Lambda_Function Pointers_Capture - Fatal编程技术网

C++ C++;Lambda分段断层

C++ C++;Lambda分段断层,c++,reference,lambda,function-pointers,capture,C++,Reference,Lambda,Function Pointers,Capture,以下代码产生分段错误,我不知道原因: myTree<int> tree; tree.insert(10); // not important std::vector<int> v = tree.toVector(); // Segmentation fault NetBeans变量窗口显示v超出了范围 问题:我是否正确使用lambda? 注意:我使用的是g++(GCC)4.7.2(Cygwin)。正如@Arkadiy在评论中提到的,有状态lam

以下代码产生分段错误,我不知道原因:

    myTree<int> tree;
    tree.insert(10); // not important

    std::vector<int> v = tree.toVector(); // Segmentation fault
NetBeans变量窗口显示v超出了范围

问题:我是否正确使用lambda?


注意:我使用的是g++(GCC)4.7.2(Cygwin)。

正如@Arkadiy在评论中提到的,有状态lambda不会衰减为函数指针。解决方法是将您的
traverseInoder
编写为接受可调用对象的模板

template<class Func>
void traverseInOrder(Func visitFunc)) {
    traverseInOrder(visitFunc, root);
}

这是一个关于如何理解您编写的代码以及如何使用调试器的问题吗?啊-这很有趣。根据this(),只有无状态lambda可以作为函数指针传递。您的代码不是无状态的。@不是sehe我从来没有打算提供可编译的精简代码。很抱歉(我会加一张便条)。但你也不是很好(“愚蠢地忽略了”)——显示损坏行为的实际简化版本。当
模板
的成员中有lambda,并将其转换为函数指针时,就会出现这种情况。确保它是无状态的代码没有运行,我们得到了完全的废话。@Robert作为旁白,链接的ideone是一个很好的简化示例。它合成、运行和分割故障。我通过消除代码中没有停止segfault的所有内容来生成它。在这里提问时,先做这一步被认为是有礼貌的。非常感谢!很抱歉,没有提供可编译的示例。@robert-您能将编译器及其版本作为问题的一部分记录下来吗?这真的应该是一个编译时错误。@robert很高兴能帮上忙@我使用的是g++(GCC)4.7.2(Cygwin)。我要给这个问题加一条注释。
v.insert(v.end(), n->count, n->key);
template<class Func>
void traverseInOrder(Func visitFunc)) {
    traverseInOrder(visitFunc, root);
}
void traverseInOrder(std::function<void(node<T>*)> visitFunc)) {
    traverseInOrder(visitFunc, root);
}