【问题标题】:"Node" not declared in scope error even though "Node" is declared inside Tree class即使在 Tree 类中声明了“节点”,也没有在范围错误中声明“节点”
【发布时间】:2021-03-03 11:03:13
【问题描述】:

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

  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 }

但我得到以下编译错误:

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) {

我不明白为什么它抱怨“节点”没有在范围内声明。 我确实在 Tree 类中声明了“节点”。

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

 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 }

【问题讨论】:

  • 问题只是因为第 26 行的返回一旦我将其更改为 Tree::Node 编译通过我认为函数参数,c++ 将查看 Tree 命名空间,因此没有错误跨度>

标签: c++ c++11 binary-search-tree


【解决方案1】:

NodeTree 的内部类。将类定义之外的引用更改为 Tree::Node,以便 g++ 在正确的命名空间中查找您的定义。

像这样:

std::shared_ptr<Tree::Node> Tree::insert(int val, std::shared_ptr<Node> subTree) {
   ...
}

您还需要在插入函数中修复 return true,因为您应该返回 std::shared_ptr&lt;Tree::Node&gt;

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

【讨论】:

  • 这解决了这个错误。但我不明白,为什么我在不同的函数中看不到错误 55 void Tree::inOrderTraversal(std::shared_ptr node) { 56 if (node) { 57 inOrderTraversal(node->left); 58 std::cout 数据右); 60 } 61 }
  • @Suhas 我正在寻找更多原因,但似乎只有返回类型才需要范围界定。似乎在Tree::inOrderTraversal 内部,Tree 类命名空间是假定的,不是必需的。
  • 是的,我也有同样的想法并对其进行了测试。问题仅在于返回类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2017-11-18
相关资源
最近更新 更多