C++ 如何声明模板类的模板
如何声明模板类的模板??见以下代码:C++ 如何声明模板类的模板,c++,templates,C++,Templates,如何声明模板类的模板??见以下代码: 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 decla
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?>;
文件:A.h
甲级
{
...
...
};
档案:B.h
样板
B类
{
...
...
};
文件C.h
样板
C类
{
...
...
};
文件C.cpp
//在这个文件中,我能够为类A(非模板类)编写模板声明
#包括“A.h”
模板C//这个很好用。
如何为类B(模板类)编写相同的代码
#包括“B.h”
模板C;
C模板需要非模板类型,以便生成类。这就是为什么C
有效:A
不是模板。但是,C
不起作用,因为B
只是类型本身的模板。您需要一些类型来实例化B
模板
例如,这可能会起作用:
C<B<A> > x;
cx;
C模板需要非模板类型,以便生成类。这就是为什么C
有效:A
不是模板。但是,C
不起作用,因为B
只是类型本身的模板。您需要一些类型来实例化B
模板
例如,这可能会起作用:
C<B<A> > x;
cx;
如果要使用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> >();
模板类C//i、 e提供某种类型的B模板类
//^^^^这是显式实例化所必需的!
C变量;
C*指针=新的C();
如果要使用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> >();
模板类C//i、 e提供某种类型的B模板类
//^^^^这是显式实例化所必需的!
C变量;
C*指针=新的C();
嗯,B也是一个模板,所以类似于C
的东西也可以工作
请注意,有些编译器将
>
视为移位运算符,需要C
好的,B也是一个模板,因此类似C
的东西可以工作
请注意,有些编译器将
>
视为移位运算符,需要C
您可以这样编写:
C< B< A > > c;
C>C;
如果您感到困惑,则可以使用typedef:
typedef B<A> MyB;
C<MyB> c;
typedef B MyB;
C C;
您可以这样写:
C< B< A > > c;
C>C;
如果您感到困惑,则可以使用typedef:
typedef B<A> MyB;
C<MyB> c;
typedef B MyB;
C C;
< /代码>我认为它不会在任何C++版本中解析。我认为,显式实例化需要在类名之前写入class
。另外,你想要达到什么目的?我不认为它在任何C++版本中解析。我认为,显式实例化需要在类名之前写入class
。另外,您想达到什么目的??请注意,C++03编译器需要将>
视为移位运算符,而C++0x(可能将成为C++11)编译器需要/将不需要此处的空间。@Christopher-我使用的编译器没有那么严格,大多数编译器在默认情况下并不遵循任何标准,即使使用“严格”标志,也很少有编译器遵循任何标准。尽管如此,这是C++03标准的一个众所周知的缺陷,因此我希望您的编译器至少在其文档中清楚地说明它们在这方面违反了规范。(在这种特殊情况下,这并不是我的大问题。)请注意,C++03编译器需要将>
视为移位运算符,而C++0x(可能将成为C++11)编译器不需要这里的空间。@Christopher-我使用的编译器没有那么严格,大多数编译器在默认情况下并不遵循任何标准,即使使用“严格”标志,也很少有编译器遵循任何标准。尽管如此,这是C++03标准的一个众所周知的缺陷,因此我希望您的编译器至少在其文档中清楚地说明它们在这方面违反了规范。(在这种情况下,我并没有太大的问题。)