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

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

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

您必须在标题中定义类模板的成员函数。然后写

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

}
,

您可以在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

本文链接:https://www.f2er.com/3117156.html

大家都在问