C++ Lambda局部变量捕获错误

jslywgbw  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(155)

我尝试使用lambda表达式使inorderTraversal函数可重用,并且在尝试捕获printStandartDeviation函数的本地参数时出现以下错误:没有从'(lambda at [...]/AVLTree.cpp:[...])'到'void(*)(AVLTree::TreeNode *)'的可行转换。

void AVLTree::printStandartDeviation() {
    int totalWordCount = 0, totalWordFrequencies = 0;
    inorderTraversal(root, [&totalWordCount, &totalWordFrequencies](TreeNode *tNode) {
        totalWordCount++;
        totalWordFrequencies += tNode->frequency;
    });
}

void AVLTree::inorderTraversal(TreeNode *tNode, void (*visit)(TreeNode *)) {
    if (tNode == nullptr) {
        return;
    } else {
        inorderTraversal(tNode->left, visit);
        visit(tNode);
        inorderTraversal(tNode->right, visit);
    }
}

字符串
如果我把局部变量设为静态变量或者全局变量,它会修复,但实际上我并不想这样做。
我也愿意接受其他解决方案,而不是使用lambda。
如果你能帮忙我将不胜感激。

xghobddn

xghobddn1#

lambda不是函数指针。一个非捕获的lambda有一个到函数指针的转换,但是一个捕获的lambda没有。它有点类似于指向自由函数的指针和指向成员函数的指针之间的区别,其中指向成员函数的指针本身用处不大。你需要一个对象来调用成员函数。这里你还需要数据,捕获的变量,来调用lambda,它不仅仅是一个函数。
不需要函数指针。简单地按原样传递lambda,因为lambda类型没有名称,所以将该方法作为模板来使其工作:

template <typename F>
void AVLTree::inorderTraversal(TreeNode *tNode, F&& visit) {
    // all the same
}

字符串

相关问题