模板的套嵌可以理解成在另外一个模板里面定义一个模板。以模板(类,或者函数)作为另个模板(类,或者函数)的成员就是成员模板。
首先成员模板是不可以作为virtual的,这个是由于他的虚函数表使用不灵活。
我们看一个套嵌的例子,先看函数的使用,typeid(A).name()返回的是A的类型信息,用name函数返回,A可以是一个对象,也可以是一个对象类型。
而且,类定义的时候,成员函数里面是可以定义该成员函数所属类的类对象的,因为在能构调用非静态成员函数之前必须先创建一个类对象,也就是说类的构造函数已经可见!其实类的成员函数之间都是可见的,即便是你在类的构造函数里面调用这个类的其他的成员函数,也是可以的,程序中的 //C 处。
再次,套嵌的成员模板,我们以类为研究对象,模板中套嵌模板类使用 的模板可以使用自己的模板,也可以使用包含类的模板,即便是声明的是包含类对象,在程序里面的(//A)处,而包含类的模板就只能使用自己的模板,使用了被包含类的模板就会出错,如程序中的 //B处。
#include<iostream>
#include<typeinfo>
usingnamespacestd;
template<classT>
classouter{
public:
template<classR>
classinner{
public:
voidf();
};
voidf();
};
//A:
template<classT>
template<classR>
voidouter<T>::inner<R>::f(){
inner<T>a;
outer<T>b;
inner<R>c;
outer<R>d;
cout<<"Outeris"<<typeid(a).name()<<endl;
cout<<"Outeris"<<typeid(T).name()<<endl;
cout<<"Inneris"<<typeid(R).name()<<endl;
cout<<"fullnameis"<<typeid(*this).name()<<endl;
}
//B:
template<classT>
voidouter<T>::f(){
outer<T>a;
//outer<R>a;
cout<<"Outeris"<<typeid(a).name()<<endl;
}
classa{
public:
a(){
cout<<"a()"<<endl;
f();
}
~a(){
cout<<"~a()"<<endl;
}
//C:
voidf(){
aa_a;
cout<<"ddd ";
}
private:
};
int_tmain(intargc,_TCHAR*argv[])
{
outer<int>::inner<char>in;
in.f();
outer<char>aOuter;
aOuter.f();
ahe;
he.f();
return0;
}
模板套嵌与成员模板详解
本文详细介绍了C++中模板套嵌的概念及其使用方法,包括如何在一个模板内定义另一个模板,成员模板的特性,以及如何正确使用这些模板。通过具体的代码示例,解释了成员模板的可见性和限制。
917

被折叠的 条评论
为什么被折叠?



