如果这是重复的帖子,我真的很抱歉,但我真的陷入了这个特定的问题。由于某些莫名其妙的原因,编译器无法理解 .cpp 文件中 Node* 的返回类型,代码如下:
template<typename T>
Node* BinarySearchTree<T>::DiveDownToReplace(Node* node) {
if (node->leftChild->rightChild == nullptr) {
return node->leftChild;
}
//otherwise
Node* traversingNode = node->leftChild;
Node* returnedNode;
while (true) {
if (traversingNode->rightChild->rightChild == nullptr) {
returnedNode = traversingNode->rightChild;
traversingNode->rightChild = returnedNode->leftChild;
returnedNode->leftChild = nullptr;
break;
}
traversingNode = traversingNode->rightChild;
}
return returnedNode;
}
这也是.h(头文件)中的代码:
#pragma once
template<typename T>
class BinarySearchTree {
private:
struct Node
{
T data;
Node* leftChild;
Node* rightChild;
};
int m_Length = 0;
Node* root = new Node();
public:
enum class TraverseMethod
{
preorder,
inorder,
postorder,
levelorder
};
~BinarySearchTree();
void AddElement(T value);
T RemoveRoot();
bool RemoveElement(T value);
void PrintAllElements(TraverseMethod traverseMethod);
bool IsEmpty();
bool GetSize();
bool Contains(T value);
private:
void PreOrder(Node* node);
void InOrder(Node* node);
void PostOrder(Node* node);
void LevelOrder(bool deleteNode = false);
void DiveDownToAdd(T value, Node* node);
Node* DiveDownToReplace(Node* node);
};
我收到错误“标识符节点未定义”。我尝试添加 BinarySearchTree::Node* 而不是 Node*,但收到一些奇怪的错误(c2061,语法错误:标识符“Node”)。如果这篇文章是重复的,我再次表示抱歉,但来自 C# 和 Java 等语言,我真的厌倦了这些标头问题。预先感谢您!
这里组合了两个相当复杂的 C++ 技术细节。首先,是范围和命名空间。
//otherwise
Node* traversingNode = node->leftChild;
这是
BinarySearchTree
模板的成员函数内的代码。当使用诸如Node
之类的符号时,编译器需要知道它是什么。 BinarySearchTree
定义了一个名为 Node
的内部类,所以你就可以了。问题解决了。
template<typename T>
Node* ...
但这到底是什么?这是什么奇怪的
Node
?这部分 C++ 代码不在成员函数内。你最好有一个全局类,或者类似的东西,名为 Node
,否则你会有大麻烦了。
仅仅因为碰巧定义了某个类或模板,并且它有一个名为
Node
的内部类,那么这绝对没有任何意义。当在全局范围内使用某个符号名称时,编译器不会在每个类中搜索碰巧具有相同名称的内容。 C++ 不是这样工作的。
这就是为什么你必须拼写出所有内容:
template<typename T>
typename BinarySearchTree<T>::Node *
“
template<typename T>
”的东西让模板参数有了一个宏伟的入口,由符号T
表示,并且BinarySearchTree<T>::Node
拼写出了所有内容。
这个故事的第二部分,这里唯一剩下的问题是,大火中的一切
typename
是关于什么的。
嗯,这个故事很长,你可以自己看。