标识符节点*未定义(链接器问题)[重复]

问题描述 投票:0回答:1

如果这是重复的帖子,我真的很抱歉,但我真的陷入了这个特定的问题。由于某些莫名其妙的原因,编译器无法理解 .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++ linker header-files return-type
1个回答
2
投票

这里组合了两个相当复杂的 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
是关于什么的。

嗯,这个故事很长,你可以自己看。

© www.soinside.com 2019 - 2024. All rights reserved.