2009-05-26 15 views
2

通常の1に対して2つのパラメータをとるテンプレートの特殊化はどうすればできますか? 私は、ポインタクラスを構築して、今私は、配列を作るために拡張について考えたが、私はこのような何かをしようとした場合:2つまたは1つのテンプレートパラメータを持つ同じクラス

template<class T,int s> class pointer{}; 
template<class T> class pointer{}; 

class mama{}; 
int main(){ 
    pointer<mama> m; 
} 

それは私にエラーを与えます。テンプレート... 1つのパラメータで再宣言されました。

pointer<mama,10>にはsize()とoperator []がありますが、pointer<mama>にはoperator->と*が付いていますので、専門化が必要です。

答えて

8

サイズ= 0の場合の特殊なバージョンを定義することにより

template <class TElem> 
class pointer<TElem, 0> 
{ 
    // completely different stuff for a non-array pointer 
}; 

を、あなたが実際にすることができますそれは全く違う実装ですが、同じ名前です。

ただし、別の名前を付けるほうがはっきりしているかもしれません。

2

あなたはこのような何か多分、2番目のパラメータのデフォルト値を持つことができます:あなたはコンパイル時にエラーにつながる、あなたのコード内のクラステンプレートの再宣言を持っている

template <class T, int N=0> 
class moo { 
     T *foo; 
public: 
     moo() { 
       if (N > 0) { 
         foo = new T[N]; 
       } 
       else 
       { 
         foo = new T; 
       } 
     } 
}; 
+0

他にも醜い場合は... –

3

。デフォルトのテンプレート引数とテンプレートテンプレートパラメータを持つことができます。

template<class T,int s=10> class pointer{}; 

class mama{}; 
int main(){ 
    pointer<mama> m; 
} 

私は、ポインタのサイズを持っているので、それは特殊な必要があります()と演算子[]ポインタはしませんが、それはoperator->と*を持っています。

あなたのクラスに異なるデザインが必要なように見えます。テンプレートの専門化が進むべきかどうかはわかりません。あなたの問題の外見から、あなたは本当に形質に基づいて専門化することを考えるべきです。そして、部分的な特殊

template <class TElem, int size = 0> 
class pointer 
{ 
    // stuff to represent an array pointer 
}; 

:あなたは、配列の場合の一般的なテンプレートを作ることができ

関連する問題