无法将 'LinkedList::filter(void (*)(Node*))::<lambda(Node*)>' 转换为 'void (*)(Node*)'

cannot convert 'LinkedList::filter(void (*)(Node*))::<lambda(Node*)>' to 'void (*)(Node*)'

我正在尝试实现一个简单的 LinkedList class,但出现此错误,我不明白为什么。

struct Node {
public:
    int val;
    Node* next;
    Node(int v) : val(v), next(nullptr) {}
};

struct LinkedList {
public:
    Node* head;
    Node* tail;
    LinkedList() : head(nullptr), tail(nullptr) {}

    void append(int value) {
        Node* new_node = new Node(value);
        if (head == nullptr) {
            head = new_node;
            tail = new_node;
        } else {
            tail->next = new_node;
            tail = new_node;
        }
    }

    void traverse(void (*callback)(Node* node)) {
        Node* cur = head;
        while (cur != nullptr) {
            callback(cur);
            cur = cur->next;
        }
    }

    LinkedList filter(bool (*filter_function)(Node* node)) {
        LinkedList new_list = LinkedList();
        traverse([&](Node* node) { if(filter_function(node)) new_list.append(node->val); });
        return new_list;
    }
};

错误在这一行

traverse([&](Node* node) { if(filter_function(node)) new_list.append(node->val); });

cannot convert 'LinkedList::filter(void (*)(Node*))::<lambda(Node*)>' to 'void (*)(Node*)'

如评论中所述,捕获 lambda 与函数指针不同。相反,在幕后,它是一个 fully-fledged 对象(因为它有状态)。

幸运的是,有一个简单的解决方法 - 您可以使用 std::function 的神奇力量来抽象掉所有混乱的细节。为此,您所要做的就是 #include <functional> 并更改为:

void traverse(void (*callback)(Node* node)) {

对此:

void traverse (std::function <void (Node* node)> callback) {

you are golden.