2012-02-27 13 views
1

次のように特殊な構造体/クラスを継承することはできますか?特殊化されたテンプレート構造体/クラスから継承する

template<class TKey, class TData> 
struct Container 
{ 
    virtual void Add(TKey key, TData data) = 0; 
}; 

template<class TData> 
struct Container<int, TData> 
{ 
    virtual void Add(int key, TData data) = 0; 
}; 

struct TicketContainer : public Container<std::string> 
{ 
    void Add(int key, std::string data) 
    { 
    } 
}; 

私は宣言少なすぎるテンプレートパラメータを訴えてTicketContainer宣言でエラーが発生します。

答えて

3

変更:

struct TicketContainer : public Container<std::string> 

へ:

struct TicketContainer : public Container<int, std::string> 

またはTKeyのためのいくつかの他のタイプ。

Containerの部分的な特殊化を指定しても、両方のテンプレートパラメータを指定する必要があります。

両方のテンプレートパラメータを指定しない場合は、テンプレートパラメータのデフォルトタイプを指定できます。私はここにそれを使用することができない場合は、テンプレートパラメータを並べ替えるに

// Reordered 'TData' and 'TKey'. 
template<class TData, class TKey = int> 
struct Container 
{ 
    virtual void Add(TKey key, TData data) = 0; 
}; 

template<class TData> 
struct Container<TData> // Equivalent to 'struct Container<TData, int>' 
{ 
    // This specialization seems pointless as it defines no 
    // special behaviour. 
    virtual void Add(int key, TData data) = 0; 
}; 

struct TicketContainer : public Container<std::string> 
{ 
}; 
+0

良いヒント:このケースでは、(連想コンテナは通常、その後keyvalue宣言されて反直感的であるかもしれない)TKeyTValueを並べ替えする必要があります、それはまだ知っていることは良いです。私は、部分的な専門化が、既に定義されたテンプレートパラメータを指定する負担を取り除くことを望んでいました。 – user460762

+0

いいえ、そうではありません。これは、特殊タイプが 'Container'に指定されている場合、部分的に特殊化された実装を選択することを意味します(この場合、特別な動作はありません)。 – hmjd

関連する問題