首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"Node“未在作用域错误中声明,即使在Tree类中声明了"Node”

"Node“未在作用域错误中声明,即使在Tree类中声明了"Node”
EN

Stack Overflow用户
提问于 2021-03-03 19:03:14
回答 1查看 74关注 0票数 0

我无法弄清楚为什么会出现编译错误

代码语言:javascript
复制
  5 class Tree {
  6  public:
  7     Tree() : root(nullptr) { std::cout << "tree created" << std::endl; }
  8     ~Tree() { std::cout << "tree destroyed" << std::endl; }
  9     bool add(int val);
 10     void inOrderTraversal() { inOrderTraversal(root); }
 11
 12  private:
 13     struct Node {
 14         int data;
 15         std::shared_ptr<Node> left;
 16         std::shared_ptr<Node> right;
 17         Node(int val) : data(val), left(nullptr), right(nullptr) { std::cout << "tree node created: " << data << std::endl; }
 18         ~Node() { std::cout << "tree node destroyed: " << data << std::endl; }
 19     };
 20
 21     void inOrderTraversal(std::shared_ptr<Node> node);
 22     std::shared_ptr<Node> insert(int val, std::shared_ptr<Node> subTree);
 23     std::shared_ptr<Node> root;
 24 };
 25
 26 std::shared_ptr<Node> Tree::insert(int val, std::shared_ptr<Node> subTree) {
 27     if (subTree == nullptr) {
 28         std::shared_ptr<Node> node = std::make_shared<Node>(val);
 29         return node;
 30     }
 31
 32     if (val <= subTree->data) {
 33         subTree->left = insert(val, subTree->left);
 34     } else {
 35         subTree->right = insert(val, subTree->right);
 36     }
 37     return subTree;
 38 }

但是我得到了以下编译错误:

代码语言:javascript
复制
g++ -std=c++11 boot_camp.cpp
boot_camp.cpp:26:17: error: ‘Node’ was not declared in this scope
 std::shared_ptr<Node> Tree::insert(int val, std::shared_ptr<Node> subTree) {
                 ^
boot_camp.cpp:26:21: error: template argument 1 is invalid
 std::shared_ptr<Node> Tree::insert(int val, std::shared_ptr<Node> subTree) {
                     ^
boot_camp.cpp:26:23: error: prototype for ‘int Tree::insert(int, std::shared_ptr<Tree::Node>)’ does not match any in class ‘Tree’
 std::shared_ptr<Node> Tree::insert(int val, std::shared_ptr<Node> subTree) {

我不明白为什么它会抱怨"Node“没有在作用域中声明。我确实在Tree类中声明了"Node“。

我没有在其他函数中看到错误,比如:

代码语言:javascript
复制
 55 void Tree::inOrderTraversal(std::shared_ptr<Node> node) {
 56     if (node) {
 57         inOrderTraversal(node->left);
 58         std::cout << node->data << " ";
 59         inOrderTraversal(node->right);
 60     }
 61 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-03 19:08:11

NodeTree的一个内部类。将类定义外部的引用更改为Tree::Node,这样g++就可以在正确的名称空间中查找您的定义。

如下所示:

代码语言:javascript
复制
std::shared_ptr<Tree::Node> Tree::insert(int val, std::shared_ptr<Node> subTree) {
   ...
}

您还需要在插入函数中修复您的return true,因为您应该返回一个std::shared_ptr<Tree::Node>

另外,在评论中Suhas提出了一个很好的观点,我没有注意到返回值(例如Tree::inOrderTraversal)只需要Tree::范围。这似乎是因为在函数inOrderTraversal中,编译器将根据非限定名称查找的C++ 11 Standard Section 3.4.1规则在现有类中查找Node的定义。它不会将此规则应用于返回值,因为返回值在函数之外。

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

https://stackoverflow.com/questions/66455721

复制
相关文章

相似问题

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