名称后跟“::”必须是 class 或命名空间错误,即使“::”跟在 class 名称之后

Name followed by '::' must be class or namespace error even though the '::' is following a class name

我正在尝试用 C++ 实现优先级队列。我创建了一个名为 'priority_queue.h' 的头文件,其中包含我的 class 的定义,以及一个定义通用类型的模板。我还有一个文件,在该文件中,我在名为 'priority_queue.cpp' 的文件中实现 class 定义中定义的方法,其中包含 'priority_queue.h'。我的文本编辑器和编译器都在抛出错误,尽管它们似乎有所不同。

我在 Whosebug 和其他网站上查找了其他问题,我什至直接从在线答案中复制粘贴了一些代码,这些代码应该是正确的,但即使这些代码也不起作用。

这是我的 '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

我使用的是配备 i7 8550U、16GB RAM 和 256GB SSD 的 Dell XPS 13 9370 运行 Windows 10 Home Version 1903,我的文本编辑器是 Microsoft Visual Studio代码内幕。

您必须在header中定义class模板的成员函数。并写

template <typename T>
void pqueue<T>::insert(T element, int priority){

}

您可以在 priority_queue.cpp

中像这样定义模板 class 的构造函数和插入成员函数
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)'

有两种选择

  1. 将模板函数的定义物理移动到 priority_queue.h 文件中,(即使它不是内联函数)正如来自莫斯科的@Vlad

  2. 或在 priority_queue.cpp

  3. 末尾包含以下行 template class pqueue<int>;

引用https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl