您的位置:首页 > 其它

模板编译模型

2012-03-23 11:29 204 查看
《C++Primer》关于模板编译模型有如下说法:

当编译器看到模板定义的时候,它不立即产生代码。只有在看到用到模板时,如调用了函数模板或调用了类模板的对象的时候,编译器才产生特定类型的模板实例。

一般而言,当调用函数的时候,编译器只需要看到函数的声明。类似地,定义类类型的对象时,类定义必须可用,但成员函数的定义不是必须存在的。因此,应该将类定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。

模板则不同:要进行实例化,编译器必须能够访问定义模板的源代码。当调用函数模板或类模板的成员函数的时候,编译器需要函数定义,需要那些通常放在源文件中的代码

标准 C++ 为编译模板代码定义了两种模型:分别编译模型和包含编译模型。

在包含编译模型中,编译器必须看到用到的所有模板的定义。一般而言,可以通过在声明函数模板或类模板的头文件中添加一条#include 指示使定义可用,该#include 引入了包含相关定义的源文件。

在分别编译模型中,编译器会为我们跟踪相关的模板定义。

(1)一般我们在函数模板的定义中指明函数模板为导出的,这是通过在关键字template 之前包含 export 关键字而实现的。

(2)对类模板使用 export 更复杂一些。通常,类声明必须放在头文件中,头文件中的类定义体不应该使用关键字 export,如果在头文件中使用了 export,则该头文件只能被程序中的一个源文件使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: