当前位置:编程学堂 > C++模板类头文件和实现文件分离

C++模板类头文件和实现文件分离

  • 发布:2023-09-30 03:53

-->

http://www.sychzs.cn/lvdongjie/p/4288373.html

如何分离C++模板类头文件和实现文件。这个问题与编译器有关。

引用<>中的观点: 1)标准C++定义了两种编译模板代码的模型:“包含”模型和“单独编译”模型。 2)所有编译器都支持“include”模型,部分编译器支持“单独编译”模型。

提出的问题:(发帖地址:http://www.sychzs.cn/u/20101215/15/f4f270f2-f0f9-4c5f-8765-1bfde2aeebbf.html)

第一种方法:按照C++primer中的“include”模型,使用定义模板类的头文件最后一行语句:#include "template_compile.cpp"

类模板头文件template_compile.h中:

  1. 模板
  2. 班级基础
  3. {
  4. 公众:
  5. base() {};
  6. ~base() {};
  7. T add_base(T x,T y);
  8. };
  9. #include "template_compile.cpp"

类模板的实现文件template_compile.cpp中:

  1. 模板
  2. T 基础::add_base(T x,T y)
  3. {
  4. 返回x+y;
  5. }

在使用模板的测试文件use_template.cpp中:

  1. #包括
  2. #include "template_compile.h"
  3. 使用命名空间 std;
  4. void main()
  5. {
  6. 底座 bobj;
  7. cout<
  8. }

该方法无法编译,“template_compile.cpp”文件无法“看到”“template_compile.h”文件。

但是:如果我把类模板的实现文件中的代码放在类模板的头文件中,并注释掉:#include "template_compile.cpp",那么编译运行就不会出错了。理论上,“将类模板的实现文件中的代码放在类模板的头文件中”与“使用定义模板类的头文件最后一行的语句:#include”template_compile.cpp 是一致的”,但是编译器就是打不通。

实验证明:VC9.0不支持C++primer中提到的“include”模型。

第二种方法:bruceteen提出:使用define

类模板头文件template_compile.h中:

  1. 模板
  2. 班级基础
  3. {
  4. 公众:
  5. base() {};
  6. ~base() {};
  7. T add_base(T x,T y);
  8. };
  9. #定义操
  10. #include "template_compile.cpp"

类模板的实现文件template_compile.cpp中:

  1. #ifdef 操
  2. 模板
  3. T 基础::add_base(T x,T y)
  4. {
  5. 返回x+y;
  6. }
  7. #endif

测试文件保持不变。

实验证明:在VC9.0中,该方法可以实现类模板头文件和实现文件的分离

方法三:

类模板头文件template_compile.h中:

  1. 模板
  2. 班级基础
  3. {
  4. 公众:
  5. base() {};
  6. ~base() {};
  7. T add_base(T x,T y);
  8. };

类模板的实现文件template_compile.cpp中:

  1. #include "template_compile.h"
  2. 模板
  3. T 基础::add_base(T x,T y)
  4. {
  5. 返回x+y;
  6. }

在使用模板的测试文件use_template.cpp中:使用#include "template_compile.cpp"

  1. #包括
  2. #include "template_compile.cpp"
  3. 使用命名空间 std;
  4. void main()
  5. {
  6. 底座 bobj;
  7. cout<
  8. }

实验证明:在VC9.0中,该方法可以实现类模板头文件和实现文件的分离。

另外,实验证明VC9.0不支持“单独编译”模式。

-->

相关文章