无法将 '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) {
我正在尝试实现一个简单的 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) {