目录
一、普通类的成员函数模板
不论模板类还是不同类,它们的成员函数都可以是一个函数模板,统称为成员函数模板。除了虚函数,虚函数不可以成为模板函数,因为虚函数需要在子类中重新定义,但是因为没有具体的参数类型,无法生成其对应的代码,所以虚函数并不能同时为模板函数。
类内函数体:
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、类模板的显式实例化会实例出所有的成员,而不是隐式实例化那样仅实例使用过的对 象。
