模板专业化的问题

时间:2016-03-13 21:38:56

标签: c++ templates template-specialization

我正在努力让模板专业化工作。即使使用这个简单的示例代码,它也无法工作。

PriorityQueue.h

template<class T>
class PriorityQueue {

public:

    T remove();

};

template<>
class PriorityQueue<string> : public PriorityQueue<string> {

public:

    string remove();

};

PriorityQueue.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项目的link,其中包含最新的代码。

这是新的错误消息:

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

1 个答案:

答案 0 :(得分:3)

您的专业化是使用递归继承定义的。这不起作用:

class PriorityQueue<string> : public PriorityQueue<string> 

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

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

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

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

Live demo