我試圖實作一個簡單的 LinkedList 類,但出現了這個錯誤,我不明白為什么。
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*)'
uj5u.com熱心網友回復:
如評論中所述,捕獲 lambda 與函式指標不同。相反,在幕后,它是一個成熟的物件(因為它有狀態)。
幸運的是,有一個簡單的解決方法——你可以使用 的神奇力量std::function來抽象出所有凌亂的細節。要做到這一點,你所要做的就是#include <functional>改變這個:
void traverse(void (*callback)(Node* node)) {
對此:
void traverse (std::function <void (Node* node)> callback) {
你是金子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/474876.html
