C++ 为什么会出现错误';未定义对“MinHeap”的引用<;char>;::插入(字符,整数)`';

C++ 为什么会出现错误';未定义对“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

我目前正在尝试实现一个最小堆,但是,我遇到了一个问题。 我很难确定为什么我的代码在编译时没有正确链接。文件、命令和错误如下所示:

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 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