- 一、普通类的成员函数模板
- 二、类模板的成员函数模板
- 三、模板显式实例化与声明
不管是普通类还是类模板,它的成员函数都可以是个函数模板,成为"成员函数模板",不可以是虚函数,否则编译器会报错。
class A
{
public:
template
void myft(T tmpe)
{
cout << tmpe << endl;
}
};
int main()
{
A a;
a.myft(10); //编译器在遇到这条语句时,编译就会实例化这个函数模板。
return 0;
}
二、类模板的成员函数模板
类模板的模板参数必须用<>指定,成员函数模板(函数模板)的参数可以推断。
类模板的成员函数(包括普通成员函数 / 成员函数模板)只有为程序所用(代码中出现了对该函数或者该函数的模板调用时)的时候才会进行实例化。
如果某函数从未使用,则不会实例化该成员函数。
template三、模板显式实例化与声明class A { public: void print() { cout << m_ic << endl; } template A(T2 v1, T2 v2); //构造函数也引入自己的模板参数T2,和整个类的模板参数C没有关系 public: C m_ic; }; template template A ::A(T2 v1, T2 v2) { m_ic = v1; cout << v1 << " " << v2 << endl; } int main() { A a1(1, 2); //实例化了一个A 类,并用int类型来实例化构造函数 A a2(1.1f, 2.2f); //A 已经被上面代码进行实例化了,这里用float来实例化构造函数 a1.print(); a2.print(); return 0; }
为了防止在多个.cpp文件中都实例化相同的类模板,所以C++11提出了一种解决方法,我们称为"显式实例化"。
通过"显式实例化"来避免这种生成多个相同类模板实例的开销
A tmpobj(6, 7);
模板的实例定义只有一个,实例化声明可以有多个。
#pragma once #ifndef __CAH__ #define __CAH__ #includeusing namespace std; template class A { public: template A(T2 v1, T2 v2); template void myft(T1 tmpt) { cout << tmpt << endl; } public: C m_ic; }; template template A ::A(T2 v1, T2 v2) { m_ic = (C)v1; cout << v1 << " " << v2 << endl; } #endif // !__CAH__
#include#include #include "ca.h" using namespace std; extern template A ; void mfunc() { A a(1, 2); };
#include#include #include "ca.h" using namespace std; extern template A ; int main() { A a1(1, 2); A a2(1.1, 2.2); a1.myft(3); return 0; }
显示实例化实例化声明
extern template A; //其他的所有.cpp文件中都这么写 extern:定义外部变量
extern template void myfunc(int v1, int v2);
extern作用:不会在文件中生成一个extern后面所表示的模板的实例化版本代码
extern目的:告诉编译器,其他的源文件(.cpp)中已经有了一个该模板的实例化版本了



