C++ &引用;节点";未在范围错误中声明,即使;节点";在树类中声明

C++ &引用;节点";未在范围错误中声明,即使;节点";在树类中声明,c++,c++11,binary-search-tree,C++,C++11,Binary Search Tree,我无法理解为什么会出现编译错误 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(in

我无法理解为什么会出现编译错误

  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 }
5类树{
6公众:

7 Tree():root(nullptr){std::cout
Node
Tree
的内部类。将类定义之外的引用更改为
Tree::Node
,以便g++在正确的命名空间中查找定义

像这样:

std::shared_ptr Tree::insert(int-val,std::shared_ptr子树){
...
}
您还需要修复insert函数中的
return true
,因为您应该返回
std::shared\u ptr


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

这解决了该错误。但我不明白,为什么我在不同的函数中看不到错误55 void Tree::inOrderTraversal(std::shared_ptr node){56 if(node){57 inOrderTraversal(node->left);58 std::cout data right);60}61}@Suhas我正在寻找更多的原因,但似乎范围界定只需要返回类型。似乎在
树::inOrderTraversal
中,
类名称空间是假定的,并且不是必需的。是的,我也在想同样的问题,并对其进行了测试。问题只在于返回类型问题只是bec在第26行返回的时候,我把它改成树::节点编译通过了,我想函数参数,C++将在树命名空间内查找,因此没有错误。
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) {
 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 }