C++模板的正确写法
我们写模板传统的写法是这个样子的:
1. 把类的整个框架写在 .h 文件中。//注意此文件中要写上 头文件保护符
2. 把类中所有接口的实现写在 .cpp 中。
3. 在 main() 中创建 女朋友 ,调用女朋友的各种接口。
比如我自身写的这个模板,运用传统方式写下来如下:
为什么要这样写呢, 因为分开写的话,客户获取接口,却不会知道具体的实现,是闭源来财的好路字和安全的需要。
我照做了,结果编译器正常运转,而连接器会报错如下:
main.cpp:(.text+0x10): undefined reference to `BBtree<int>::insert()'
main.cpp:(.text+0x1c): undefined reference to `BBtree<int>::maketree()'
这句报错的意思是:在 .h 文件中找不到此接口的实现
所以我们得出一个结论:对于c++模板,传统方法是不适用的!!!
那怎么办?等死?等死是不可能的,这辈子都不可能等死。
有以下三种方法解决这个问题:
1. 把模板的定义与声明全部写在 .h 中 //这样做的缺点是编译文件会变得很大,显然要降低编译和链接速度
2. 显式的实例化类型
3. 运用 export 关键字 //在c11标准中已经被除名了,改用 extren 关键字防止阻止编译器在某编译单元内实例化特定模板
第三种因为已经被除名,故不讲。第二种不推荐使用,因为如果一开始就把模板全部都实例化,编写模板就会失去意义。
所以我们得出一个结论:
~~~~~~~~选第一种选第一种~~~~~~~
ps:c++的类模板大多数都是开源的,所有就不要想着分开写了,非要分,推荐《强迫症康复指南》或者用第三种方法,但已经被c++11抛弃了
得出结论后,我们可以分析原因了(分析原因需要几个知识点分别是 链接, 模板实例化等,在我其他的博文中都有所解释)。。。未完待续