【C++】 模板的分离编译

本文详细介绍了C++中的模板,包括非类型模板参数、模板特化(函数模板特化与类模板特化,如全特化和偏特化)、模板的分离编译及其引发的链接错误及预防方法。通过示例和解析,阐述了模板在实际编程中的应用和潜在问题,如代码膨胀和编译时间增加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板

目录:

  • 非类型模板参数
  • 模板的特化
    • 函数模板的特化
    • 类模板的特化
      • 全特化
      • 偏特化
  • 模板的分离编译( 重点
  • 模板的总结

非类型模板参数

概念:
模板参数分为类型模板参数与非类型模板参数。
类型模板参数:出现在模板参数列表中,跟在class或者typename后面的参数类型名称。
非类型模板参数:就是一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。

让我们来结合代码比较一下非类型模板参数的韵味.

我们先来看一下模板类型参数。
模板类型参数定义的Array类,Array类用来管理静态的,定长的数组。

#define N 10

template<class T>
class Array  
{
   
public:
	T& operator[] (size_t pos)
	{
   
		return _a[pos];
	}
private:
	T _a[N];
	size_t _size;
};
int main()
{
   
	Array<int> a1;
	Array<int> a2;
}

这是模板类型参数定义的Array类, 给对象开的空间只能由N来决定数组a1,a2的大小,如果a1要开10个空间,而a2也要开10个空间;那么N 为10就好了。如果a1要开10个空间,而a2要开100000个空间,把n的值给成100000的话,那么对a1来说,空间浪费也就太大了。

所以我们可以加上非类型模板参数。让我们再来体会一下。

template<class T,size_t N = 100>   //定义的是常量,常量不可修改。在这里我们给了缺省值
class Array  
{
   
public:
	T& operator[] (size_t pos)
	{
   
		return _a[pos];
	}
private:
	T _a[N];
	size_t _size;
};
int main()
{
   
	Array<int,10> a1; //调用非类型模板参数
	Array<int,100000> a2;
}

用了非类型模板参数,我们就可以方便开足够的空间,而且不会造成空间浪费。
我们对非类型模板参数的了解可以更进一步就是:非类型模板参数就是我想要外部的传参控制内部的大小。

但是值得注意的是:

  1. 非类型模板参数必须是常量(例子中的N)。大多数都是整形常量
  2. 非类型的模板参数必须在编译器就能确认结果
  3. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。(和第一点相同)

模板的特化

起因
通常情况下,使用模板可以实现一些与类型无关的代码,但有时候得不到成功的结果
所以。就要进行模板的特化
概念:
在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化分为 函数模板特化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值