具有常量参数时的模板特化

时间:2017-01-16 11:44:05

标签: c++

我有类Queue,它使用模板实现,一个参数用于类型,一个常量参数用于队列大小。

  template <typename T, int N>
  class Queue
  {
     .....
     void enqueue(T x);
  }

我想专门针对typename使用enqueue方法,但我无法知道如何执行此操作。

 template <typename T, int N>
 void Queue<Heap<struct infoNod>, N>::enqueue(Heap<struct infoNode> x)
 {}

对于整个班级的专业化,我不确定我是否做得对: 在标题中:

 template <>
 class Queue<Heap<struct infoNode>, 100>
 {
    public:
       void enqueue(Heap<struct infNode> x);
 }; 

在cpp:

template <>
 void Queue<Heap<struct infoNod>, 100>::enqueue(Heap<struct infoNode> x) {}

错误:

Queue.cpp:77:6: error: template-id ‘enqueue<>’ for ‘void Queue<Heap<infoNod>, 100>::enqueue(Heap<infoNode>)’ does not match any template declaration
 void Queue<Heap<struct infoNod>, 100>::enqueue(Heap<struct infoNode> x)
      ^
Queue.cpp:77:78: note: saw 1 ‘template<>’, need 2 for specializing a member function template
 void Queue<Heap<struct infoNod>, 100>::enqueue(Heap<struct infoNode> x)

2 个答案:

答案 0 :(得分:1)

由于您的类模板具有非模板enqueue()方法,因此您只能部分地专门化整个类,而不是单个方法:

template <typename T, int N>
class Queue
{
    void enqueue(T x) { /* default implementation */ }
};

template<int N>
class Queue<Heap<InfoNode>, N>
{
   void enqueue(Heap<InfoNode> x) { /* specialized implementation */ }
};

另一种选择不是专门化整个Queue类,而是让enqueue()委托给一个专门的小助手类。

答案 1 :(得分:0)

我通过扩展Queue类来解决:

class QueueSpec: public Queue<Heap<struct infoNode>, SIZE >
{
    public:
        void enqueue(Heap<struct infoNode> x);
};

---
void QueueSpec::enqueue(Heap<struct infoNode> x) {}