一、普通类的成员函数模板
不管是普通类还是模板类,它的成员函数可以是一个函数模板,称为“成员函数模板”,不可以是虚函数,否则编译器会报错。
#include <iostream>
using namespace std;
class A
{
public:
template <typename T>
void myft(T temp)//成员函数模板
{
cout << temp << endl;
}
};
int main()
{
A a;
a.myft();
return 0;
}
3
二、类模板的成员函数模板
类模板的模板参数必须用<>指定,成员函数模板(普通函数模板)的参数都可以由系统推断
#include <iostream>
using namespace std;
template<typename C>//类模板
class A
{
public:
template<typename T2>
A(T2 v1, T2 v2);//构造函数我们也引入自己的模板,和整个类的模板c没有关系
template <typename T>
void myft(T temp)//成员函数模板
{
cout << temp << endl;
}
void myftpt() { }
C m_ic;
};
template <typename C>//先跟类模板的参数列表
template <typename T2>//再跟构造函数自己的模板参数列表
A<C>::A(T2 v1, T2 v2)
{
cout << v1 << v2 << endl;
}
int main()
{
A<float>a(1, 2);
A<float>a2(1.1, 2.2);//编译器执行到上一句会实例化,同一种实例不会实例两次,这里类似再次调用实例
return 0;
}
12
1.12.2
类模板的成员函数(包括普通成员函数/成员函数模板)只有为程序所用的(代码中出现了)才会实例化,如果某函数未使用,则不会实例化该成员函数。
三、模板显示实例化,模板声明
为了防止在多个.cpp文件中都实例化相同的类模板,所以C++11提出了一个解决方法,我们成为“显示实例化”;通过”显示实例化“类对这种生成多个相同类模板实例的开销
test.cpp
//"显示实例化"手段中"实例化定义",这种实例化定义只需要在一个.cpp文件就可以。
template A<float>;//编译器遇到这段代码就直接实例化一个A<float>类
//在其它test.cpp中只需声明就行
test2.cpp
extern template A<float>;//其它声明都这么写
//extern目的就是告诉编译器在其它.cpp中已经有该模板的实例化类了
模板的实例化定义只有一个,声明可以由多个。