gpt4 book ai didi

c++ - 编译器给出 lambda 函数转换错误

转载 作者:行者123 更新时间:2023-11-30 01:02:31 25 4
gpt4 key购买 nike

首先,定义一个树节点,其中BFSTraversal是呼吸优先搜索,ReconstructBFS就是根据广度优先搜索序列构造一棵树。

template<typename T>
struct TreeNode
{
T val;
TreeNode *left;
TreeNode *right;

explicit TreeNode(T x) : val(x), left(nullptr), right(nullptr)
{}

static void BFSTraversal(TreeNode *node, void visit(T));

static TreeNode<T> *ReconstructBFS(vector<T> &seq);
};

然后重载 <<运算符,它给出了我不理解的编译器错误我的 lambda 函数有问题吗

template<typename T>

ostream &operator<<(ostream &os, TreeNode<T> *node)
{
void (*visit)(T) = [&os](T v) -> void
{ os << v << ','; };

// compiler error
// cannot convert 'operator<<(std::ostream&, TreeNode<T>*)
// [with T = int; std::ostream = std::basic_ostream<char>]::<lambda(int)>' to 'void (*)(int)' in initialization
TreeNode<T>::BFSTraversal(node, visit);

return os;
}

enter image description here

我打算实现如下代码。

auto bfs_seq = vector<int>{1,0,2,3}; // 0 represents `null`
TreeNode* root = ReconstructBFS(bfs_seq);
cout << root;

你可以跳过这个。我不确定,但我认为这与我的问题没有直接关系。

执行BFSTraversal .

static TreeNode<T> *ReconstructBFS(vector<T> &seq)
{
auto seq_size = seq.size();
if (seq_size == 0) return {};
auto root = new TreeNode<T>(seq[0]);

queue<TreeNode<T> *> q;
q.push(root);
auto level_len = 1, i = 1;
auto next_level_len = 0;
auto null_val = T();

while (!q.empty())
{
for (auto j = 0; j < level_len; ++j)
{
auto cur_parent = q.front();
q.pop();

auto v = seq[i++];
if (v == null_val) cur_parent->left = nullptr;
else
{
cur_parent->left = new TreeNode(v);
++next_level_len;
}

v = seq[i++];
if (v == null_val) cur_parent->right = nullptr;
else
{
cur_parent->right = new TreeNode(v);
++next_level_len;
}
}

level_len = next_level_len;
next_level_len = 0;
}

return root;
}

最佳答案

只有在不捕获的情况下,lambda 函数才能分配给函数指针。如果捕获,则不能将其分配给函数指针。

参见 Passing capturing lambda as function pointer了解更多。

改用std::function

// Not this.
// void (*visit)(T) = [&os](T v) -> void { ... }

std::function<void(T)> visit = [&os](T v) -> void { ... }

当然,这也需要您更改函数 BFSTraversal。它应该期待一个 std::function 而不是一个函数指针。

关于c++ - 编译器给出 lambda 函数转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55945474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com