03~C++模板编译模型

1.C/C++ 传统编译模型

函数/变量 声明和定义分开存放,声明放在头文件,定义放在C文件或者CPP文件

优点

  1. 发行商发行头文件,源代码不公开
  2. 头文件越小,编译时间越短

如果函数定义或者变量定义在头文件中,会造成编译错误,典型代码如下:

/*h.h*/
int val;
void bar()
{
}
/*b.cpp*/
#include "h.h"
/*a.cpp*/
#include "h.h"
int main()
{
	return 0;
}

2. C++ 模板包含模型

2.1 包含模型

  1. 模板不是源代码,而是生成代码的指令。因此可以被重复包含在cpp文件中,而不会发生重定义问题
    举例:
    在这里插入图片描述
/*h.h*/
template <typename T>
T const Min(T a, T b)
{
	return (a>b) ? b : a;
}
/*b.cpp*/
#include "h.h"
#include <iostream>
void fool()
{	
	using namespace std;
	cout << Min<int>(10,100) << endl;
}
/*a.cpp*/
#include "h.h"
#include <iostream>
void bar()
{	
	using namespace std;
	cout << Min <int> (10,100) << endl;
}
void fool();

int main()
{
	fool();
	bar();
	return 0;
}

2.2 包含模型优化

模板编译非常耗时。而上述包含模型每一个cpp文件都会进行一次模板实例化,因此非常浪费时间!

模板在h_inst.cpp 中进行实例化
在这里插入图片描述
注意:a.cpp b.cpp如果使用某种实例化版本,在h_inst.cpp中应当有对应的特化版本,否则将发生未定义错误

/*h.h*/
template <typename T>
T const Min(T a, T b);
/*h.cpp*/
#include "h.h"
template <typename T>
T const Min(T a, T b)
{
	return a>b? b : a;
}
/*h_inst.cpp*/
#include "h.cpp"
template int const Min<int>(int , int );
template double const Min<double>(double , double );
/*b.cpp*/
#include "h.h"
#include <iostream>
void fool()
{	
	using namespace std;
	cout << Min<int>(10,100) << endl;
}
/*a.cpp*/
#include "h.h"
#include <iostream>
void bar()
{	
	using namespace std;
	cout << Min <double> (1.1,2.2) << endl;
}
void fool();

int main()
{
	fool();
	bar();
	return 0;
}

运行结果:
在这里插入图片描述

2.3 分离模型/显示实例化(编译器需要支持export)

这是最简单的模型,但是编译器设计十分困难!
在这里插入图片描述

/*h.h*/
template <typename T>
T const Min(T a, T b);
/*h.cpp*/
#include "h.h"
export template <typename T>
T const Min(T a, T b)
{
	return a>b? b : a;
}
/*a.cpp*/
#include <iostream>
#include "h.h"
using namespace std;

int main()
{
	cout << Min<int> (10,100) << endl;
	cout << Min<double> (10.1,10.2) << endl;
	return 0;
}

CNU编译器结果:不支持export关键字
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值