我正在尝试在C ++中实现优先级队列的实现。我创建了一个名为“ priority_queue.h”的头文件,其中包含我的类的定义以及定义通用类型的模板。我还有一个文件,用于实现在类定义中定义的方法,该文件位于名为“ priority_queue.cpp”的文件中,其中包括“ priority_queue.h”。我的文本编辑器和编译器都抛出错误,尽管它们似乎有所不同。
我在StackOverflow和其他站点上查找了其他问题,甚至从网上答案中直接复制粘贴了一些代码,这些代码本来是正确的,甚至是行不通的。
这是我的“ priority_queue.h”头文件中的代码
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
template <typename T>
class pqueue{
public:
pqueue();
void insert(T element, int priority);
private:
vector<T> elements(); //This vector will store our data in the correct order
};
这是我的“ priority_queue.cpp”文件中的代码
#include <iostream>
#include <iterator>
#include <vector>
#include "priority_queue.h"
using namespace std;
template <typename T>
void pqueue::insert(T element, int priority){
}
编译器抛出错误,并说'template<class T> class pqueue' used without template parameters
。
我的文本编辑器给我一个错误,提示name followed by '::' must be a class or namespace name
我正在使用运行Windows 10家庭版1903的i7 8550U,16GB RAM和256GB SSD的Dell XPS 13 9370,我的文本编辑器是Microsoft Visual Studio Code Insiders。
答案 0 :(得分:2)
您必须在标题中定义类模板的成员函数。然后写
template <typename T>
void pqueue<T>::insert(T element, int priority){
}
答案 1 :(得分:0)
您可以在priority_queue.cpp中定义这样的模板类的构造函数和插入成员函数
template <typename T>
pqueue<T>::pqueue(){}
template <typename T>
void pqueue<T>::insert(T element, int priority){}
为防止链接错误,例如
undefined reference to `pqueue<int>::insert(int, int)'
有两个选择
按照莫斯科的@Vlad的建议,将模板函数的定义物理地移动到priority_queue.h文件中(即使它不是内联函数)
,或在priority_queue.cpp末尾添加以下行template class pqueue<int>;
引用https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl