关于C++模版的代码文件放置问题
2013-04-16 20:37
330 查看
方法一:包含编译模型(√)
在包含编译模型中,编译器必须看到用到的所有模板的定义。一般而言,可以通过在声明函数模板或类模板的头文件中添加一条#include 指示使定义可用,该#include 引入了包含相关定义的源文件:
这一策略使我们能够保持头文件和实现文件的分离,但是需要保证编译器在编译使用模板的代码时能看到两种文件。
方法二:分别编译模型
在分别编译模型中,编译器会为我们跟踪相关的模板定义。但是我们必须让编译器知道要记住给定的模板定义,可以使用export关键字来做这件事。
export关键字能够指明给定的定义可能会需要在其他文件中产生实例化。在一个程序中一个模板只能定义为导出一次。编译器在需要产生这些实例化时计算出怎样定位模板定义。export关键字不必在模板声明中出现。
一般我们在函数模板的定义中指明函数模板为导出的,这是通过在关键字template之前包含export关键字而实现的:
这个函数模板的声明像通常一样应放在头文件中,声明不必指定export。
对类模板使用export更复杂一些。通常,雷声明放在头文件中,头文件中的类定义体不应该使用关键字export,如果在头文件中使用export,则头文件只能被程序中的一个源文件使用。
相反,应该在类的实现文件中使用export:
导出类的成员将自动声明为导出的。也可以将类模板的个别成员声明为导出的,在这种情况下,关键字export不在类模板本身指定,而是只在被到处的特定成员定义上指定。导出成员函数的定义不必在使用成员时可见。任意非导出成员的定义必须像在包含模型中一样对待:定义放在定义类模板的头文件中。
在包含编译模型中,编译器必须看到用到的所有模板的定义。一般而言,可以通过在声明函数模板或类模板的头文件中添加一条#include 指示使定义可用,该#include 引入了包含相关定义的源文件:
//header file utilities.h #ifndef UTILITIES_H #define UTILITIES_H template<typename T>int compare(const T& v1, const T& v2); #include "utilities.cpp" //get the definitions for compare etc. #endif
//implemenatation file utilities.cpp template<typename T>int compare(const T& v1, const T& v2) { if (v1 < v2) return -1; else if (v2 < v1) return 1; else return 0; }
这一策略使我们能够保持头文件和实现文件的分离,但是需要保证编译器在编译使用模板的代码时能看到两种文件。
方法二:分别编译模型
在分别编译模型中,编译器会为我们跟踪相关的模板定义。但是我们必须让编译器知道要记住给定的模板定义,可以使用export关键字来做这件事。
export关键字能够指明给定的定义可能会需要在其他文件中产生实例化。在一个程序中一个模板只能定义为导出一次。编译器在需要产生这些实例化时计算出怎样定位模板定义。export关键字不必在模板声明中出现。
一般我们在函数模板的定义中指明函数模板为导出的,这是通过在关键字template之前包含export关键字而实现的:
//the template definition goes in a separately-compiled source file export template<typename Type> Type sum(const Type& t1, const Type& t2) { //... }
这个函数模板的声明像通常一样应放在头文件中,声明不必指定export。
对类模板使用export更复杂一些。通常,雷声明放在头文件中,头文件中的类定义体不应该使用关键字export,如果在头文件中使用export,则头文件只能被程序中的一个源文件使用。
相反,应该在类的实现文件中使用export:
//class template header goes in shared header file template<typename Type>class Queue{....};
//Queue.cpp implementation file declares Queue as exported export template<typename Type>class Queue; #include "Queue.h" //Queue member definitions
导出类的成员将自动声明为导出的。也可以将类模板的个别成员声明为导出的,在这种情况下,关键字export不在类模板本身指定,而是只在被到处的特定成员定义上指定。导出成员函数的定义不必在使用成员时可见。任意非导出成员的定义必须像在包含模型中一样对待:定义放在定义类模板的头文件中。
相关文章推荐
- C++模版 代码文件放置问题
- VS2017 c++关于#include 头文件错误问题
- c++关于文件打开目录的问题
- 关于SVN上传代码,.so文件.a文件自动被过滤的问题
- 关于C++头文件问题
- 关于C++模版的连接错误问题
- 关于c/c++ 工程中获取文件路径、设置输出文件路径的问题
- 关于C++的头文件互相包含的问题
- 同一段C++代码在win下和linux下同时编译时产生的头文件包含问题及解决
- 关于帝国cms,列表页模版,使用程序代码不生效问题解决
- AndroidStudio中关于assets文件夹下放置文件问题
- 关于Struts2中文件上传代码ServletActionContext.getServletContext()编译报错的问题,
- C++关于头文件容易混淆的问题
- 关于C++头文件相互包含的问题(个人见解)
- 关于.net网站 js文件更新 但js代码不能写入的问题
- 关于 文件下载--------代码没有报错,又不弹出下载框,执行下载无反应的问题
- 关于在xcode里面c++代码与objective-c代码混编的问题
- C++问题小结--3.构造函数与析构函数关于其自身特点的简单代码陈述
- 【MFC】:MFC关于文件读写的代码及结构体的错误问题
- protobuf如何用proto文件导出C++代码文件及链接protobuf静态库问题