即使'::'后面跟着一个类名,但“名称后跟'::'必须是类或命名空间”错误仍会出现。

4
我正在尝试在C++中实现优先队列。我创建了一个名为“priority_queue.h”的头文件,其中包含了我的类的定义,以及定义了一个通用类型的模板。我还有一个文件,在文件中我实现了类定义中定义的方法,名为“prioriy_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"。
我使用戴尔XPS 13 9370,搭载i7 8550U处理器、16GB内存和256GB固态硬盘,在运行Windows 10 Home Version 1903的同时使用Microsoft Visual Studio Code Insiders作为我的文本编辑器。

3
“_Name followed by '::' must be class or namespace error even though the '::' is following a class name_” 的意思是“‘::’后面的名称必须是类或命名空间,即使在类名后面也是如此”的错误。实际上并不是这样。pqueue是一个模板,用于生成一个类,它本身不是一个类。pqueue<T>才是一个类。 - Algirdas Preidžius
1
以下是我 'priority_queue.cpp' 文件中的代码。将模板实现放在 .cpp 文件中可能会导致问题。详情请参见https://dev59.com/O3RB5IYBdhLWcg3w1Kr0。 - drescherjm
2个回答

4

你必须在头文件中定义类模板的成员函数,并编写相应代码。

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

}

1
您可以在priority_queue.cpp中像这样定义模板类的构造函数和insert成员函数。
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 from Moscow 的建议,将模板函数的定义物理移动到 priority_queue.h 文件中(即使它不是内联函数)

  2. 或在 priority_queue.cpp 的末尾包含以下行 template class pqueue<int>;

参考 https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接