成员函数模板、模板的显式实例化和声明

目录

一、普通类的成员函数模板

二、类模板的成员函数模板

三、模板的显式实例化和声明


一、普通类的成员函数模板

不论模板类还是不同类,它们的成员函数都可以是一个函数模板,统称为成员函数模板。除了虚函数,虚函数不可以成为模板函数,因为虚函数需要在子类中重新定义,但是因为没有具体的参数类型,无法生成其对应的代码,所以虚函数并不能同时为模板函数。

类内函数体:

class Goodname 
{
public:
    template<class T>
    void CoutInformation(T a)
        {
            cout<<a<<endl;
        }

};

Goodname a;
a.CoutInformation(3);//函数模板可以自行推断

 类外函数体:

class A
{
public:
	template<class T>
	void Func(T a);
};
template<class T>
void A::Func(T a)
{
	cout << a << endl;
}

二、类模板的成员函数模板

类内函数体:

template<class T>
class A
{
public:
	template<class R>
	void Func(R a)
        {
            Cout<<a<<endl;
        }
};

类外函数体:

template<class T>
class A
{
public:
	template<class R>
	void Func(R a);
};

template<class T>
template<class R>
void A<T>::Func(T a)
{
	cout << a << endl;
}

 类模板成员函数包括普通成员函数和成员函数模板,只有被我们调用了才会进行实例化,生成实例化版本。如果某函数并未被使用,那就不会实例化该成员函数。

三、模板的显式实例化和声明

为了防止在多个.cpp文件中相同用法使用模板类从而造成其生成多个可执行文件中出现过多的重复实例化的类模板,我们可以在其中一个.cpp文件的开头进行 实例化的定义 ,再在其他同样需要使用同类型实例化的.cpp文件中使用extern声明外部的.cpp的实例化的定义。

//.h文件
template<class T>
class A
{
public:
T a;
};

//某个.cpp文件
template A<int>;//实例化定义

//其他.cpp文件
extern template A<int>;//模板的实例化声明。这些.cpp文件不会再单独生成此类型的模板的实例化代码

模板函数也有这种用法。

//某.h文件
template<class T>
void Func(T a)
{
cout<<a<<endl;
}
//某.cpp文件
template void Func(int a);

//其他.cpp文件
extern template void Func(int a);

注意:1、这种避免方法并不一定成功,也就是说其他.cpp文件中同样有可能生成了实例化代码。             2、类模板的显式实例化会实例出所有的成员,而不是隐式实例化那样仅实例使用过的对                      象。

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼多不菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值