#include<iostream>
#include "SmartDB.h"
using namespace std;
extern template class A<int>; //模板实例化声明
int main(int argc, char* argv[])
{
A<int> obj1;
/*比较疑惑的是不是说用了显示实例化定义以后,只会生成一个实例化的样本吗?
这个样本应该只有Smart.obj文件才会有,可是mian.obj文件里面也会有,这一步
我没想明白,估计是编译器升级导致的,不同的编译器有不同的效果吧,
模板实例化定义就是为了避免在多个不同的源文件生成大量相同的实例化样本的。
这个先不管它了*/
obj1.fun(2); //用的是在其它文件当中生成的实例化样本,在链接这一步完成。
return 0;
}
#include "SmartDB.h"
/*模板实例化定义,这个会导致fun和fun1会被实例化,可以通过把obj文件导出来观察*/
template class A<int>;
template <typename T>
void A<T>::fun(T i)
{
std::cout << i << std::endl;
}
template <typename T>
void A<T>::fun1(T i)
{
std::cout << i << std::endl;
}
#ifndef SMARTDB_H
#define SMARTDB_H
#include <iostream>
using namespace std;
template<typename T>
class A {
public:
void fun(T i);
void fun1(T i);
};
#endif
导出目标文件
同样也可以试一下函数模板的实例化定义与声明。