2017-01-16 5 views
3

テンプレートの型として実装されるクラスQueueがあります。型のパラメータとキューのサイズの定数パラメータがあります。定数パラメータを持つときのテンプレートの特殊化

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

私は型名のために、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) 
+0

あなたが唯一のメンバ関数を特化することはできません、あなたがクラス全体を特化する必要があります。または、 'Queue 、N>'から継承し、 'enqueue'関数だけをオーバーライドする派生クラスを作成してください。 –

+0

私はクラスを編集しようとしました。 –

+0

あなたは 'Queue 'を意味すると思います。そうでなければ、エンキュー関数は 'Queue >、100>'をパラメータとして受け入れるでしょう。 –

答えて

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()代理人を作る。

+0

私はQueueを特化し、その実装をヘッダーに移しました。しかし、私が専門化するならば、未特定のクラスからメソッドとメンバーにアクセスできますか?私は特殊化されていないクラスにメソッドprintを持っていますが、エラーが発生します(エラー: 'class Queue ,256>'メンバ 'print'はありません) –

+0

@georgiana_e:一般クラスと特殊クラスは無関係です。自分のメソッドを別のメソッドから呼び出すことはできません。 –

0

私はキュークラスを拡張することで解決している:

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

--- 
void QueueSpec::enqueue(Heap<struct infoNode> x) {} 
関連する問題