C++ 为什么会出现错误';未定义对“MinHeap”的引用<;char>;::插入(字符,整数)`';
我目前正在尝试实现一个最小堆,但是,我遇到了一个问题。 我很难确定为什么我的代码在编译时没有正确链接。文件、命令和错误如下所示: min_heap.hC++ 为什么会出现错误';未定义对“MinHeap”的引用<;char>;::插入(字符,整数)`';,c++,c++11,C++,C++11,我目前正在尝试实现一个最小堆,但是,我遇到了一个问题。 我很难确定为什么我的代码在编译时没有正确链接。文件、命令和错误如下所示: min_heap.h #ifndef MIN_HEAP_H #define MIN_HEAP_H #include <vector> #include <algorithm> using namespace std; template <typename T> struct HeapNode { HeapNode(const
#ifndef MIN_HEAP_H
#define MIN_HEAP_H
#include <vector>
#include <algorithm>
using namespace std;
template <typename T>
struct HeapNode {
HeapNode(const T data, const int key) : data(data), key(key) {}
bool operator<(const HeapNode<T>& rhs) {return this->key < rhs.key;}
bool operator<=(const HeapNode<T>& rhs) {return this->key <= rhs.key;}
T data;
int key;
};
template <typename T>
class MinHeap {
public:
MinHeap() {};
~MinHeap() {};
void insert(const T data, const int key);
T extract_min();
T peek() const;
int size() const;
private:
vector<HeapNode<T>> heap;
};
#endif
错误:
customMain.o:customMain.cpp:(.text+0x41): undefined reference to `MinHeap<char>::insert(char, int)'
collect2.exe: error: ld returned 1 exit status
customMain.o:customMain.cpp:(.text+0x41):对“MinHeap::insert(char,int)”的未定义引用
collect2.exe:错误:ld返回了1个退出状态
任何帮助都将不胜感激 两种选择
1) 将模板实现移出cpp文件,并将它们放在标题中。编译器在编译main.cpp时,无法看到生成char专门化所需的代码,因此最终会留下一个未解析的外部文件。将代码移动到头文件将解决此问题(几乎所有模板代码都驻留在头文件中)
2) 您可以从cpp文件中导出专门化,但是类型会提前锁定(即,您只能使用导出的类型),这会降低使用模板的灵活性和整体意义。这就是为什么99.99%的人选择了选项1,99.99%的人选择了选项1
//导出char、short、int和float的专门功能
模板类MinHeap;
模板类MinHeap;
模板类MinHeap;
模板类MinHeap;
这是否回答了您的问题?非常感谢你解决了我的问题。
#include <iostream>
#include "min_heap.h"
using namespace std;
int main(){
MinHeap<char> heap = MinHeap<char>();
const char data = 'a';
const int key = 7;
heap.insert(data, key);
return 0;
}
g++ -c min_heap.cpp
g++ -c customMain.cpp
g++ min_heap.o customMain.o
customMain.o:customMain.cpp:(.text+0x41): undefined reference to `MinHeap<char>::insert(char, int)'
collect2.exe: error: ld returned 1 exit status