为什么我的 heap.h 文件给我一个LNK2001错误?
Why does my heap.h file give me a LNK2001 error?
我做了一些搜索并看到了这个错误,但在许多情况下,这是由于缺少包含引起的。 头文件也在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
文件中,您还可以定义Leaf
从Node
公开继承。因此,当它试图构建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>* &)
。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '