为什么我的 heap.h 文件给我一个LNK2001错误?

Why does my heap.h file give me a LNK2001 error?

本文关键字:一个 LNK2001 错误 heap 我的 文件 为什么      更新时间:2023-10-16

我做了一些搜索并看到了这个错误,但在许多情况下,这是由于缺少包含引起的。 头文件也在vs2019中的"头文件"下

该错误是在主Leaf<int> leaf(3);

这是我的主要内容.cpp

#include "heap.h"
#include <iostream>
using namespace std;
int main()
{
//Need to complete testing from main
Heap<int> heap(2);
Leaf<int> leaf(3);
//heap.insert(3);
}

这是 heap.h 中的相关类

template <typename T> class Leaf : public Node<T> {
private:
T key;
public:
Leaf(T value) { key = value; }
virtual Leaf<T>* toLeaf() { return this; }
virtual Leaf<T>* insert(T key, Node<T>*& created) {
Leaf<T>* newLeaf = new Leaf<T>(key);
created = newLeaf;
return newLeaf;
}
};

错误:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol "public: virtual class Leaf<int> * __cdecl Node<int>::insert(int,class Node<int> * &)" (?insert@?$Node@H@@UEAAPEAV?$Leaf@H@@HAEAPEAV1@@Z)    2-3-4 Heap  C:Userscatcalsourcerepos2-3-4 Heap2-3-4 Heapmain.obj 1   

为什么我的 heap.h 给我一个链接错误?

您可以通过定义的错误号检查这是哪种链接错误,在这种情况下,它是LNK2001.这说明您有一个未解析的外部符号。

当您尝试调用翻译单元中的函数时,尚未定义的*.cpp文件将导致链接器失败。它将生成您看到的LNK2001错误。它根本不知道如何处理您尝试调用的函数,因为它尚未定义。

仔细查看说明会知道导致链接器触发此错误标志的原因。它指出,找不到Node<int>::insert(int,class Node<int> * &),或者没有public: virtual class Leaf<int> *声明

的定义您看到这种情况的原因是,在您的main.cpp文件中,您正在调用Heap的构造函数和Leaf的构造函数。从您的heap.h文件中,您还可以定义LeafNode公开继承。因此,当它试图构建Leaf<T>时,它无法这样做,因为它无法完全构建Node<T>

从您展示的代码中;您已经声明并定义了Leaf<T>::insert(T key, Node<T>*& created)但没有看到其他可能的包含的此头文件的重置,以及您是Node<T>类模板的声明和定义,因此没有简单的方法可以知道。但是,我怀疑Node<T>::insert(T key, Node<int>* &)不是通过模板推导来定义或生成的,因为尚未定义Node<T>::insert(T key, Node<T>* &)