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

本文详细解析了C++中模板及成员模板的概念与用法,包括如何定义成员模板、成员模板与虚函数的关系、成员模板的可见性以及成员模板如何使用自身的模板参数等关键知识点。

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

首先成员模板是不可以作为virtual的,这个是由于他的虚函数表使用不灵活。

我们看一个套嵌的例子,先看函数的使用,typeid(A).name()返回的是A的类型信息,用name函数返回,A可以是一个对象,也可以是一个对象类型。

而且,类定义的时候,成员函数里面是可以定义该成员函数所属类的类对象的,因为在能构调用非静态成员函数之前必须先创建一个类对象,也就是说类的构造函数已经可见!其实类的成员函数之间都是可见的,即便是你在类的构造函数里面调用这个类的其他的成员函数,也是可以的,程序中的 //C 处。

再次,套嵌的成员模板,我们以类为研究对象,模板中套嵌模板类使用 的模板可以使用自己的模板,也可以使用包含类的模板,即便是声明的是包含类对象,在程序里面的(//A)处,而包含类的模板就只能使用自己的模板,使用了被包含类的模板就会出错,如程序中的 //B处。

 

 

#include <iostream>
#include <typeinfo>


using namespace std;

template 
<class T>
class outer {
public
:
    template 
<class R>
    class inner {
    public
:
        void f();
    };
    void f();
};

//A:
template 
<class T>
template 
<class R>
void outer
<T>::inner<R>::f() {
    inner
<T> a;
    outer
<T> b;
    inner
<R> c;
    outer
<R> d;

    cout 
<< "Outer is " << typeid(a).name() << endl;

    cout 
<< "Outer is " << typeid(T).name() << endl;
    cout 
<< "Inner is " << typeid(R).name() << endl;
    cout 
<< "full name is" << typeid(*this).name() << endl;
}

//B:
template 
<class T>
void outer
<T>::f() {
    outer
<T> a;
    
//outer<R> a;
    cout 
<< "Outer is " << typeid(a).name() << endl;
}

class a {
public
:
    a() {
        cout 
<< "a()" <<endl;
        f();
    }

    
~a() {
        cout 
<< "~a()" <<endl;
    }
//C:
    void f() {
        a a_a;
        cout 
<< "ddd ";
    }
private
:
    
};

int _tmain(int argc, _TCHAR* argv[])
{
    outer
<int>::inner<char> in;
    in
.f();

    outer
<char> aOuter;
    aOuter
.f();

    a he;
    he
.f();
    
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值