C++使用auto结构化绑定初始化含树节点的struct时报node未定义错误
问题根因
你遇到的报错本质是编译器不支持C++17新增的结构化绑定语法:编译器无法正确解析auto [node, left_subtree_traversed]的写法,不会把node识别为合法声明的变量,因此后续引用node时抛出未定义错误:
Identifier 'node' is undefined
你之前尝试替换auto为NodeAndState、decltype无法解决问题,是因为结构化绑定是C++17才引入的语法规则,和绑定的变量类型无关,低版本标准下无论怎么修改类型都无法识别该写法。
解决方案
方案1:开启C++17及以上编译标准(推荐)
直接在编译选项中开启C++17或更高版本标准即可完美运行原代码:
- GCC/Clang 编译时添加参数:
-std=c++17(也可使用更高的-std=c++20/-std=c++23) - Visual Studio(MSVC)在项目属性的「C/C++ -> 语言 -> C语言标准」中选择「ISO C17 标准 (/std:c++17)」或更高版本
方案2:替换为低版本C++兼容写法
如果受环境限制无法使用C17,将结构化绑定的行替换为C11/14兼容的普通成员访问写法即可:
while (!empty(in_process)) { // 替换原结构化绑定行 const auto& top_elem = in_process.top(); const BinaryTreeNode<int>* node = top_elem.node; bool left_subtree_traversed = top_elem.left_subtree_traversed; in_process.pop(); // 后续逻辑保持不变 if (node) { if (left_subtree_traversed) { result.emplace_back(node->data); } else { in_process.push({node->right.get(), false}); in_process.push({node, true}); in_process.push({node->left.get(), false}); } } }
内容的提问来源于stack exchange,提问作者kanulilewa
相关产品推荐
相关产品推荐

