我正在努力让模板专业化工作。即使使用这个简单的示例代码,它也无法工作。
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
答案 0 :(得分:3)
您的专业化是使用递归继承定义的。这不起作用:
class PriorityQueue<string> : public PriorityQueue<string>
如果你想专门化,你不需要让它继承自己。这应该足够了:
template<>
class PriorityQueue<string> {
...
}
如果您专门设计模板类,则必须提供它包含的所有内容。但是,如果您只想专门化remove()
成员,请按以下步骤操作:
template<>
string PriorityQueue<string>::remove() { /* your code there */ }