2011-05-06 222 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)編譯器將/不需要這裏的空間。 – 2011-05-06 13:02:02

+0

@Christopher - 我用過的編譯器並不是那麼嚴格,而且似乎是從上下文中區分出來的。 – 2011-05-06 13:24:30

+0

大多數編譯器默認情況下並不真正遵循任何標準,即使使用「嚴格」標誌,也很少這樣做。儘管如此,這是C++ 03標準中一個非常着名的缺陷,所以我當然希望你的編譯器至少在文檔中清楚地說明他們在這方面違反了規範。 (並不是說在這種情況下我有一個很大的問題。) – 2011-05-06 13:55:20

2

C模板期望一個非模板類型,以便它可以生成一個類。這就是爲什麼C<A>有效:A不是模板。但是,C<B>不起作用,因爲B對於某種類型本身僅是模板。你需要有一些類型來實例化B模板。

舉例來說,這可能是工作:

C<B<A> > x; 
+0

謝謝...我現在弄明白了。 – deepak4bin 2011-05-06 13:09:42

3

如果你想使用B參數C類模板,那麼你可以這樣寫:

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 2011-05-06 12:50:24

+1

我不認爲它解析*任何* C++版本。我想,明確的實例化需要在類名之前寫入'class'。另外,你想達到什麼目的? – 2011-05-06 12:50:43

+0

@Johannes:這是一個錯字。 – Nawaz 2011-05-06 12:55:16

2

你可以只寫它:

C< B<A> > c; 

如果你覺得還不清楚,那麼你可以使用一個typedef:

typedef B<A> MyB; 
C<MyB> c;