如何解决即使在 Tree 类中声明了“Node”,也未在范围错误中声明“Node”
我不知道为什么会出现编译错误
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 类中声明了“Node”。
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 }
解决方法
Node
是 Tree
的内部类。将类定义之外的引用更改为 Tree::Node
,以便 g++ 在正确的命名空间中查找您的定义。
像这样:
std::shared_ptr<Tree::Node> Tree::insert(int val,std::shared_ptr<Node> subTree) {
...
}
您还需要修复插入函数中的 return true
,因为您应该返回一个 std::shared_ptr<Tree::Node>
。
此外,在评论中 Suhas 提出了一个很好的观点,我没有注意到您只需要 Tree::
范围作为返回值(例如 Tree::inOrderTraversal
)。这似乎是因为在函数 inOrderTraversal
中,编译器将根据 C++ 11 Standard Section 3.4.1 非限定名称查找规则在现有类中查找 Node
的定义。但是对于函数外部的返回值,它不会应用此规则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。