模板专用化问题

Problems with template specialization

本文关键字:问题 专用      更新时间:2023-10-16

我正在努力使模板专业化发挥作用。即使使用这个简单的示例代码,它也不会起作用。

PriorityQueue.h

template<class T>
class PriorityQueue {
public:
    T remove();
};
template<>
class PriorityQueue<string> : public PriorityQueue<string> {
public:
    string remove();
};

优先级队列.cpp

string PriorityQueue<string>::remove() {
    //implementation
}

我收到此错误消息:

.../PriorityQueue.h39:38: error: :39:38: error: base class has incomplete type
base class has incomplete type
class PriorityQueue<string> : public PriorityQueue<string> {class PriorityQueue<string> : public PriorityQueue<string> {
                              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~                              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~

编辑

我现在已将标题更改为仅专用于成员函数,但仍然出现错误。我可能应该向您展示整个代码,所以这里有一个指向 Github 上项目的链接,其中包含最近更新的代码。

这是新的错误消息:

duplicate symbol __ZN13PriorityQueueINSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEE6removeEv in:
    CMakeFiles/Oblig2_Oppg2.dir/main.cpp.o
    CMakeFiles/Oblig2_Oppg2.dir/PriorityQueue.cpp.o
ld: 1 duplicate symbol for architecture x86_64

您的专业化是用递归继承定义的。 这行不通:

class PriorityQueue<string> : public PriorityQueue<string> 

如果你想专业化,你不需要让它继承自己。这应该足够了:

template<>
class PriorityQueue<string> {
   ...
}

如果您专门化模板类,则必须提供它包含的所有内容。 但是,如果您只想使remove()成员专用化,请执行以下操作:

template<>
string PriorityQueue<string>::remove() { /* your code there */ }

现场演示