2011-05-06 113 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;