这段时间在学习C++中的模板,在网上看到有对"包含编译模型"和"分别编译模型"的说法:
看C++ templates吧,里面对这个问题讨论得很详细。
包含编译模型就是类模板的声明和定义放在一个头文件里
分离模型就是和将声明与实现分开
不过要用到export关键字
根据我对书中内容的理解:
标准C++为编译模板定义了两种模型:包含模型和分别模型,这两种方式很大程度上是相同的:类定义和函数声明
放在头文件中,而函数定义和成员定义放在源文件中.这两种模型不同之处在于,编译器怎样使用来自源文件的定义而已.
对"包含编译模型",可以通过在声明函数模板或类模板的头文件中添加一条#include指示使定义可用,
从而引入包含相关定义的源文件.如下:
---------------------
// header file utlities.h
#ifndef AAAA_H
#define AAAA_H
template <class T> int compare(const T&, const T&);
......
#include "utilities.cc"
#endif
=======---------------
//implementation file utlities.cc
template <class T> int compare(const T &v1,const T &v2)
{
//implemente
......
}
-------------------
这一策略使我们能够保持头文件和实现文件分离.
本书的作者并不是说"包含编译模型"就是将申明和定义放在同一个头文件中.这里分别放在了utlities.h和utlities.cc中,
只是在utlities.h时用了#include "utlities.cc".
而"分离编译模型"只是在使用了关键字"export"来告诉编译器模板定义在哪里引用.
如果在头文件类声明中使用了export,则该头文件只能被源文件使用一次;
如果在实现文件中使用了export,有两种情况:
一种是在实现文件的开头加上
export template <class Type> class Xxxx;
#include "Xxxx.h"
//others definitions
....
这类情况中,导出类成员都会自动声明为导出.
另一种情况就是对个别成员声明要导出的,只能对个别成员使用export.
"包含编译模型"并不是类模板的声明和定义放在一个头文件里;
"分离编译模型"也并不是将申明和定义分开.