C++模板应用——让模板定义和实现分离的方法
来源:互联网 发布:ubuntu ntfs 编辑:程序博客网 时间:2024/06/07 19:03
关于c++中类的模板,惯常的用法都是把实现和定义放在头文件里了事。这样的问题是,加大了头文件的长度,减低了模板代码的可读性,还有就是破坏了面向对象的隐藏实现的规则。下面就是这种问题的两个解决方案的总结。
假设模板代码如下:
1 // 模板定义 a.h
2 #include <stdio.h>
3
4 template <class tType>
5 class TTEST
6 ...{
7 private:
8 tType i ;
9 public:
10 void output();
11 } ;
12
13 // 模板实现 a.cpp
14 #include "a.h"
15
16 template<class tType>
17 void TTEST<tType>::output()
18 ...{
19
20 printf("output: ") ;
21 }
22
23 // 调用模块 test.cpp
24 #include "a.cpp"
25
26 int main()
27 ...{
28 TTEST<int> t ;
29 t.output();
30 return 1 ;
31 }
复制代码
注意调用模块test.cpp中,不要包含头文件a.h直接包含a.cpp,这样就能够编译成功。这是由于编译器要建立 TTEST<int> 这个类型需要模板实现,但从头文件里没找到,所以它会认为实现在其它编译单元中,但它不会报错,而把找实现部分的工作留给了linker。linker同样也是找不到实现,因此就不能生成TTEST<int>。上述第一种解决方法直接包含了实现文件,让compiler直接找到定义和实现,这样的效果跟把定义和实现都放在a.h里是一样的。
第二中方法,类似第一种,只是test.cpp只包含a.h,然后新增一个文件impl.cpp内容如下:
// impl.cpp
#include "a.cpp"
template class TTEST<int> ;
假设模板代码如下:
1 // 模板定义 a.h
2 #include <stdio.h>
3
4 template <class tType>
5 class TTEST
6 ...{
7 private:
8 tType i ;
9 public:
10 void output();
11 } ;
12
13 // 模板实现 a.cpp
14 #include "a.h"
15
16 template<class tType>
17 void TTEST<tType>::output()
18 ...{
19
20 printf("output: ") ;
21 }
22
23 // 调用模块 test.cpp
24 #include "a.cpp"
25
26 int main()
27 ...{
28 TTEST<int> t ;
29 t.output();
30 return 1 ;
31 }
复制代码
注意调用模块test.cpp中,不要包含头文件a.h直接包含a.cpp,这样就能够编译成功。这是由于编译器要建立 TTEST<int> 这个类型需要模板实现,但从头文件里没找到,所以它会认为实现在其它编译单元中,但它不会报错,而把找实现部分的工作留给了linker。linker同样也是找不到实现,因此就不能生成TTEST<int>。上述第一种解决方法直接包含了实现文件,让compiler直接找到定义和实现,这样的效果跟把定义和实现都放在a.h里是一样的。
第二中方法,类似第一种,只是test.cpp只包含a.h,然后新增一个文件impl.cpp内容如下:
// impl.cpp
#include "a.cpp"
template class TTEST<int> ;
如此一来,也能达到定义与实现分离的目的。只是也要包含a.cpp,另外随着模板实例化不同的类型,impl,cpp中的类型也要跟着改变,有点笨拙的方法
http://www.cnblogs.com/lscheng/archive/2011/10/18/2216569.html
0 0
- C++模板应用——让模板定义和实现分离的方法
- C++模板应用——模板定义和实现分离
- 14.c++-类模板不能让声明和实现分离
- C++类模板定义与实现的分离—学习C++数据抽象和问题求解
- C++函数模板声明和定义分离的方法
- c++模板定义和实现分离
- C++模板定义和实现分离导致的编译错误
- C++ Primer是采用这样的技术让模板定义和实现分离 || vc2005 “NULL”: 未声明的标识符 vc2005
- 【c++模板】模拟实现有模板的双向链表(List)(声明和定义分离)
- C++中类模板和实现分离的方法
- C的宏定义实现模板函数——C的C++模板函数机制实现
- 类模板不能让声明和实现分离
- 类模板不能让声明和实现分离
- 模板类定义时,模板方法定义与声明的分离
- 转:C++模板定义和实现分离导致的编译错误
- C++分离类模板的声明和定义
- C/C++--模板类实现.h和.cpp分离
- ASP网页模板的应用: 让程序和界面分离,让ASP脚本更清晰,更换界面更容易
- Can I Use SFP Transceiver in SFP+ slot?
- 欢迎使用CSDN-markdown编辑器
- java学习之二叉排序树
- oracle中同义词
- mysql连接慢的一个原因
- C++模板应用——让模板定义和实现分离的方法
- 通过域名连接服务器
- Unreal Open day 2017 参会小结
- jsonp 跨域访问
- 数学模型之解析解、闭合解、数值解
- JAVA递归算法实例小结
- Java 数组第二大的值
- CentOS7.0环境下,为MariaDB设置中文
- 移动端开发时,让字体小于12px的方法