首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将“LinkedList::filter(void(*)(Node*)”)::<lambda(Node*)>转换为“void(*)(Node*)”

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

Stack Overflow用户
提问于 2022-05-13 18:27:34
回答 1查看 26关注 0票数 0

我试图实现一个简单的LinkedList类,但是这个错误会出现,我不明白为什么。

代码语言:javascript
复制
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;
    }
};

错误在这一行中。

代码语言:javascript
复制
traverse([&](Node* node) { if(filter_function(node)) new_list.append(node->val); });

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-13 18:37:16

正如注释中提到的,捕获lambda与函数指针不一样。相反,在幕后,它是一个完全成熟的对象(因为它有状态)。

幸运的是,有一个简单的解决办法--你可以使用std::function的神奇力量来抽象出所有混乱的细节。要做到这一点,您所要做的就是使用#include <functional>并更改如下:

代码语言:javascript
复制
void traverse(void (*callback)(Node* node)) {

对此:

代码语言:javascript
复制
void traverse (std::function <void (Node* node)> callback) {

你是金的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72234002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档