后面跟有“ ::”的名称必须是类或名称空间错误,即使“ ::”紧跟在类名之后

时间:2019-11-12 13:13:17

标签: c++ class templates mingw header-files

我正在尝试在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。

2 个答案:

答案 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)'

有两个选择

  1. 按照莫斯科的@Vlad的建议,将模板函数的定义物理地移动到priority_queue.h文件中(即使它不是内联函数)

  2. ,或在priority_queue.cpp末尾添加以下行template class pqueue<int>;

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