c++学习笔记 函数模板,类模板,类模板中的模板成员函数,显式实例化

定义一个函数模板的格式如下:

template<typename T>
T add(T a,T b)
{
    return a+b;
}

类模板函数只有在使用的时候才会生成实例,调用只有类型参数的函数模板时,编译器可以通过参数来推断参数类型,当其中有类型参数和非类型参数时,需要在调用时填入类型名。

定义一个类模板的时候应该为如下的格式:

template<typename T>
class A
{
    public:
    T func(T a);
};

template<typename T>
T A<T>::func(T a)
{
    return a;
}

类模板中的成员函数只有在调用的时候才会生成实例,在类模板中使用类名时不需要加类模板参数,类外用一定要加。

 

模板成员函数不能是虚函数,不然程序报错。

模板成员函数的定义格式:

template<typename C>
class A
{
    public:
    template<typename T>
    void func(T a,T b);
};

template<typename C>//先类的模板
template<typename T>//再函数模板
void A<C>::func(T a,T b)
{
     return a>b?a:b;
}

 

显式实例化:

当多个文件都调用一个模板类或者模板函数时,模板类(函数)会在多个文件里实例化,大大降低了效率,为了能使模板只实例化一次,就需要显式实例化,比方说有以下模板:

template<typename C>
class A
{
    public:
    C _value;
};

template<typename T>
void prt(T a)
{
    cout<<a<<endl;
}

现有cpp1,cpp2两个文件,在cpp1文件里进行显式实例化:

template A<float>;
template void prt<float>(float a);

在其他文件里声明此模板:

extern template A<float>;
extern template void prt<float>(float a);

此方法不推荐用,似乎用处不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值