套嵌模板,成员模板,模板的使用

本文详细介绍了C++中模板套嵌的概念及其使用方法,包括如何在一个模板内定义另一个模板,成员模板的特性,以及如何正确使用这些模板。通过具体的代码示例,解释了成员模板的可见性和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板的套嵌可以理解成在另外一个模板里面定义一个模板。以模板(类,或者函数)作为另个模板(类,或者函数)的成员就是成员模板。

首先成员模板是不可以作为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值