模板专业化的问题
Problems with 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> {
~~~~~~~^~~~~~~~~~~~~~~~~~~~~ ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
编辑
我现在已经将 header 更改为仅专门化成员函数,但仍然会出错。我可能应该向您展示整个代码,所以这里是 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
你的专业化是用递归继承定义的。这行不通:
class PriorityQueue<string> : public PriorityQueue<string>
如果你想特化,你不需要让它自己继承。这应该足够了:
template<>
class PriorityQueue<string> {
...
}
如果您专门化模板 class,则必须提供它包含的所有内容。但是,如果您只想专门化 remove()
成员,请按以下方式进行:
template<>
string PriorityQueue<string>::remove() { /* your code there */ }
我正在努力使模板专业化工作。即使使用这个简单的示例代码也无法正常工作。
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> {
~~~~~~~^~~~~~~~~~~~~~~~~~~~~ ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
编辑
我现在已经将 header 更改为仅专门化成员函数,但仍然会出错。我可能应该向您展示整个代码,所以这里是 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
你的专业化是用递归继承定义的。这行不通:
class PriorityQueue<string> : public PriorityQueue<string>
如果你想特化,你不需要让它自己继承。这应该足够了:
template<>
class PriorityQueue<string> {
...
}
如果您专门化模板 class,则必须提供它包含的所有内容。但是,如果您只想专门化 remove()
成员,请按以下方式进行:
template<>
string PriorityQueue<string>::remove() { /* your code there */ }