2011-05-06 11 views
1

テンプレートクラスのテンプレートを宣言するにはどうすればよいですか?コードの下に以下を参照してください。それは、クラスを生成することができるようにテンプレートクラスのテンプレートを宣言する方法

File: A.h 
class A 
{ 
    ... 
    ... 
}; 

File: B.h 
template <typename U> 
class B 
{ 
    ... 
    ... 
}; 

File C.h 
template <class T> 
class C 
{ 
    ... 
    ... 
}; 

File C.cpp 
//In this file I am able to write template declaration for class A(non-template class) 
#include "A.h" 
template C<A>; //this works fine. 

How can I write the same for class B(which is a template class.) 
#include "B.h" 
template C<What should I write here for class B?>; 

答えて

1

まあ、Bをテンプレートなので、C<B<A>>のようなものが動作します。

コンパイラの中には、シフト演算子として>>があり、C<B<A> >が必要です。

+0

C++ 03のコンパイラはシフト演算子として ''を見る必要があることに注意してください.C++ 0x(たぶんC++ 11になる予定です)のコンパイラはここにスペースを必要としないことが必要です。 –

+0

@Christopher - 私が使用しているコンパイラはそれほど厳密ではなく、その違いを文脈から整理しているようです。 –

+0

ほとんどのコンパイラはデフォルトでは実際には標準に従っていません。それでも、これはC++ 03標準の非常によく知られている欠点なので、あなたのコンパイラが少なくともこの文書の仕様書に違反していることを文書で明示してくれることを祈っています。 (私はこの特定のケースでは大きな問題を抱えているわけではありません)。 –

2

Cテンプレートは、非テンプレートの種類を期待しています。そのため、C<A>が動作します:Aはテンプレートではありません。ただし、タイプBテンプレートであるため、C<B>は機能しません。 Bテンプレートをインスタンス化するには、ある種の型が必要です。

例えば、これは仕事ができる:

C<B<A> > x; 
+0

おかげで...私は今それを得ました。 – deepak4bin

3

あなたはBCタイプ引数にとしてクラステンプレートを使用する場合は、これを書くことができます。

template class C<B<int> >; //i.e provide the some type B template class 
     //^^^^ this is needed for explicit instantiation! 

C<B<A> > variable; 
C<B<short> > *pointer = new C<B<short> >(); 
+0

私は '>>'を使っていません。 – Nawaz

+1

私はそれが* C + +バージョンで解析するとは思わない。明示的なインスタンス化では、クラス名の前に 'class'を書く必要があります。また、どのような目的を達成したいですか? –

+0

@Johannes:それはタイプミスでした。 – Nawaz

2

あなたはちょうどこのようにそれを書き込むことができます。

C< B<A> > c; 

あなたは、あなたがtypedefを使用することができます混乱することが判明した場合:

typedef B<A> MyB; 
C<MyB> c; 
関連する問題