我们正常使用模板的时候都是将声明和定义放在一起.
- 这里要注意的是 模板不是一种数据类型! 他既不是函数也不是类,他是生成这两者的 “模板”!这个概念可能有点绕, 举例来说: 我有一张
设计图(template), 这个设计图是用来制作板凳的.
那么光有这张设计图,我是没法使用的.我需要有材料,或者说指定用什么材料去做板凳,比如我要用木头或者用塑料之类的.当我有了这些材料之后,再按照图纸去制作出了板凳才能真正被使用. - 到这里再说说编译器对于模板的处理. 编译器看到模板之后,就比如是一名木匠看到了图纸,光看到图纸的话 木匠是什么都做不了的.他只能等到别人要求他制作板凳,并且告诉他需要用什么材料去做,才会真的动手去生产出一个板凳.
下面看一个实际的例子:
你现在要为别人提供一个库, 那么常用的做法是
- 写一个头文件,将函数定义放在这里.
- 写一个源文件 包含头文件,将实现放在这里. 因为你并不想要别人知道怎么实现的,只要知道怎么用就行了.
- 将他编译成 静态库或者动态库 提供给别人使用.
但是现在问题来了,头文件里有一个 模板函数!
类似如下:
//foo.h
#pragma once
template <class T>