C++头文件中的模板类

C++头文件中的模板类

这已经是我的第三篇关于头文件的博客了,没想到我还是踩了个巨坑。

大家都知道要在头文件里声明类成员,在源文件中实现。

但是今天写数据结构作业,在头文件(Stack.h)定义了一个栈的模板类,在源文件(Stack.cpp)实现了相应的功能。但是编译死活不过,怎么改怎么过不了。

结果发现,模板类不能只在头文件里声明,必须在头文件里实现。

是不可能只在单独的cpp文件中编写模板类实现并进行编译的。如果有人说可以,那么肯定是模仿单独cpp文件使用的办法。实际上,如果打算编写模板类库并作为头文件导入,且隐藏实现,这根本不可能。

为什么?

因为头文件从不编译,只会进行预处理。然后将预处理完的代码与对应的、实际编译的cpp文件合并。C++中每一个对象所占的空间大小,是编译的时候就确定了。在模板类没有传入数据类型的时候,编译器无法知道该模板类的对象所占用的空间大小。

所以在预处理完的头文件和源文件结合的过程中,编译器是完全不知道源文件中模板类的空间大小的,但是它需要编译源文件。所以它无法编译下去。

所以记住,只有模板类真正被使用的时候,编译器才知道模板传入的是什么类型,需要分配多少空间。

模板类的实现,如果脱离了具体的数据类型,是绝对不可能单独编译的。更不用说在头文件中声明,在源文件中实现这种不可取的方法了。

所以模板类的实现必须全部写在头文件里!

当然了,也可以现在头文件的类内部声明,在花括号外面实现。

除非,你想在主文件中,打出 #include "xxxx.cpp"的神奇操作。

posted @ 2020-03-16 21:52  scyq  阅读(1383)  评论(0编辑  收藏  举报