【问题标题】:Problems with template specialization模板专业化的问题
【发布时间】:2016-03-13 21:38:55
【问题描述】:

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

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

【问题讨论】:

  • 你忘了定义一个叫做string的类型。

标签: c++ templates template-specialization


【解决方案1】:

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

class PriorityQueue<string> : public PriorityQueue<string> 

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

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

如果你专门化一个模板类,你必须提供它包含的所有东西。但是,如果您只想专门化 remove() 成员,请执行以下操作:

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

Live demo

【讨论】:

  • 我也试过了。通过这样做,我也无法访问在第一个 PriorityQueue 类中声明的其他方法。
  • @Ferdinand 那是因为两者无关。 PriorityQueue&lt;string&gt; 是一个单独的类型,它只与 PriorityQueue&lt;T&gt; 共享一个名称。它不共享任何成员,也没有等级关系。
  • @Ferdinand 如果有“头等舱中的其他方法”,那么您没有向我们提供足够的信息来回答您的问题。
  • @Ferdinand 我已经编辑了答案,向您展示如何只专注于一个成员函数
  • 在头文件中声明特化。在您的一个 cpp 文件中定义专业化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多