Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板专门化的问题_C++_Templates_Template Specialization - Fatal编程技术网

C++ 模板专门化的问题

C++ 模板专门化的问题,c++,templates,template-specialization,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.h

template<class T>
class PriorityQueue {

public:

    T remove();

};

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

public:

    string remove();

};

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

class PriorityQueue<string> : public PriorityQueue<string> 

您忘了定义一个名为
string
的类型。我也试过了。这样做,我也无法访问第一个PriorityQueue类中声明的其他方法。@Ferdinand,这是因为这两个方法是不相关的
PriorityQueue
是一种单独的类型,它只与
PriorityQueue
共享一个名称。它不共享任何成员,也没有层次关系。@Ferdinand如果“第一个类中有其他方法”,那么您没有提供足够的信息来回答您的问题。@Ferdinand我编辑了答案,向您展示了如何专门化一个成员函数在头文件中声明专门化。在一个cpp文件中定义专门化。
.../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> {

                              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~                              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
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> {
   ...
}
template<>
string PriorityQueue<string>::remove() { /* your code there */ }