C++学习:模板编译模式

来源:互联网 发布:centos mysql默认密码 编辑:程序博客网 时间:2024/06/06 17:31

C++函数模板和类模板,如果分别在.h头文件中声明,在.cpp源文件中定义,一旦调用到该模板,编译时就会报如下图所示错误。这与模板的编译模式有关。


C++支持两种模板编译模式:包含模式(Inclusion Model)和分离模式(Separation Model)。

包含编译模式

在包含编译模式下我们在每个模板被实例化的文件中包含函数模板的定义并且往往把定义放在头文件中像对内联函数所做的那样。

分离编译模式

在分离编译模式下函数模板的声明被放在头文件中,在这种模式下,函数模板声明和定义的组织方式与程序中的非内联函数的声明和定义组织方式相同。

在分离编译模式的模板定义中有一个关键字export,关键字export 告诉编译器在生成被其他文件使用的函数模板实例时可能需要这个模板定义编译器必须保证在生成这些实例时该模板定义是可见的。关键字export不需要出现在头文件的模板声明中。

分离模式使我们能够很好地将函数模板的接口同其实现分开,进而组织好程序以便把函数模板的接口放到头文件中,而把实现放在文本文件中。但是,并不是所有的编译器都支持分离模式,即使支持也未必总能支持得很好。支持分离模式需要更复杂的程序设计环境,所以它们不能在所有C++编译器实现中提供。

目前VC、VS的任何版本皆不支持分离模式!
g++不支持模板实例化的export关键字(此关键字的这个用法已在C++11标准里被取消)。

大部分编译器在编译模板时都使用包含模式。当未使用这个函数模版或类模版,编译器并不实例化它,当被使用时,编译器需要实例化它,因为编译器是一次只能处理一个编译单元, 也就是一次处理一个cpp文件,所以实例化时需要看到该模板的完整定义。所以都放在头文件中。这不同于普通的函数, 在使用普通的函数时,编译时只需看到该函数的声明即可编译, 而在链接时由链接器来确定该函数的实体。

0 0