实现C++模板类头文件和实现文件分离的方法
如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关。
引用<<C++primer(第四版)>>里的观点:1)标准C++为编译模板代码定义了两种模型:“包含”模型和“分别编译”模型。2)所有编译器都支持“包含”模型,某些编译器支持“分别编译”模型。
问题的提出:(帖子在:http://topic.csdn.net/u/20101215/15/f4f270f2-f0f9-4c5f-8765-1bfde2aeebbf.html)
第一种方法:按C++primer中的“包含”模型,在定义模板类的头文件中的末行用语句:#include "template_compile.cpp"
在类模板头文件template_compile.h中:
- template<class T>
- class base
- {
- public:
- base() {};
- ~base() {};
- T add_base(T x,T y);
- };
- #include "template_compile.cpp"
在类模板的实现文件template_compile.cpp中:
- template<class T>
- T base<T>::add_base(T x,T y)
- {
- return x+y;
- }
在使用模板的测试文件use_template.cpp中:
- #include<iostream>
- #include "template_compile.h"
- using namespace std;
- void main()
- {
- base<int> bobj;
- cout<<bobj.add_base(2,3)<<endl;
- }
这种方法不能通过编译,"template_compile.cpp"文件不能"看见"“template_compile.h"文件。
然而:如果我把类模板的实现文件里代码放在类模板的头文件中,注释掉:#include "template_compile.cpp",编译和运行不会有任何错误。理论上”把类模板的实现文件里代码放在类模板的头文件中“和”在定义模板类的头文件中的末行用语句:#include "template_compile.cpp" “是一致的,但编译器就是通不过。
实验证明:VC9.0不支持C++primer中所说的“包含”模型。
第二种方法:bruceteen提出的:使用define
在类模板头文件template_compile.h中:
- template<class T>
- class base
- {
- public:
- base() {};
- ~base() {};
- T add_base(T x,T y);
- };
- #define FUCK
- #include "template_compile.cpp"
在类模板的实现文件template_compile.cpp中:
- #ifdef FUCK
- template<class T>
- T base<T>::add_base(T x,T y)
- {
- return x+y;
- }
- #endif
测试文件不变。
实验证明:在VC9.0中,这种方法可以实现类模板头文件和实现文件的分离
方法三:
在类模板头文件template_compile.h中:
- template<class T>
- class base
- {
- public:
- base() {};
- ~base() {};
- T add_base(T x,T y);
- };
在类模板的实现文件template_compile.cpp中:
- #include "template_compile.h"
- template<class T>
- T base<T>::add_base(T x,T y)
- {
- return x+y;
- }
在使用模板的测试文件use_template.cpp中:使用#include "template_compile.cpp"
- #include<iostream>
- #include "template_compile.cpp"
- using namespace std;
- void main()
- {
- base<int> bobj;
- cout<<bobj.add_base(2,3)<<endl;
- }
实验证明:在VC9.0中,这种方法可以实现类模板头文件和实现文件的分离。
另外实验证明:VC9.0不支持“分别编译”模型。
实现C++模板类头文件和实现文件分离的方法的更多相关文章
- C++模板类头文件和实现文件分离
http://www.cnblogs.com/lvdongjie/p/4288373.html 如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关. 引用<<C++primer ...
- 【TP3.2】模板引用头和尾.html文件
传送门:http://document.thinkphp.cn/manual_3_2.html#include 使用模版表达式 模版表达式的定义规则为:模块@主题/控制器/操作 例如: <inc ...
- 学艺不精而惭愧--论C++模板类的使用
自己断断续续地使用C++也有一段时间了.有些时候产生了自满的情绪.觉得自己对C++的语言特性已经知道的几乎相同了,在语法方面没有什么难倒我的地方了,如今所要做的是依据实际问题编敲代码,问题的难点在于算 ...
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? 这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现 ...
- C++模板类代码只能写在头文件?
这个问题,实际上我几年前就遇到了.最近写个模板类玩的时候,再次遇到. 当我非常仔细的将定义和实现分开,在头文件中保留了最少的依赖后,一切就绪.cpp单独编过.但是当使用的时候,就会报告所有的函 ...
- C++头文件中的模板类
C++头文件中的模板类 这已经是我的第三篇关于头文件的博客了,没想到我还是踩了个巨坑. 大家都知道要在头文件里声明类成员,在源文件中实现. 但是今天写数据结构作业,在头文件(Stack.h)定义了一个 ...
- [转]VC++的类头文件
本文转自:http://blog.csdn.net/forevertali/article/details/4370602 animal.h //在头文件中包含类的定义及类成员函数的声明 clas ...
- C++的模板类:不能将定义与声明写在不同文件中
问题来源 今天看了orbslam2自带的第三方库DBoW2的TemplatedVocabulary.h文件,发现其中模板类的函数成员的定义与声明放在了同一个文件:同时发现,DBoW2的CMakeLis ...
- CS文件类头注释
1.修改unity生成CS文件的模板(模板位置:Unity\Editor\Data\Resources\ScriptTemplates 文件名:81-C# Script-NewBehaviourScr ...
随机推荐
- (转)ASP.NET 2.0中的partial
1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个 不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放 ...
- zookeeper集群的安装
顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员, Apache Hbase和 Apache Solr 的分布式集群都用到了zook ...
- java操作csv文件之javacsv.jar应用
csv文件是分隔文件,如果使用java的io流来写,比较麻烦,这里为大家提供一个javacsv的jar包,这个很方便操作csv文件. 下载地址:https://pan.baidu.com/s/1i46 ...
- 常用语句1【weber出品】
1.查看控制文件位置: select * from v$controlfile show parameter control; 2.查询日志文件位置 select group#,status,mem ...
- java的注释
最近在做java项目开始关注和注意一些java规范,目的只是为了让自己和别人更容易理解自己写的代码和复用. 一个重要的原则就是:问你自己,你如果从来没有见过这段代码,你要快速地知道这段代码是干什么的, ...
- yum 安装 kvm
KVM是什么? for Kernel-based Virtual Machine 安装环境Centos 6.5 mini x64 禁用selinux, 禁用防火墙 安装过程: 1. 查看我们的电脑是 ...
- 11061160顾泽鹏homework-01
我的Github地址是buaa11061160 教材:中文版 代码大全 (第二版) 斯蒂夫·迈克康奈尔 设计思路: 输入了一串数组a[0].a[1]..... 从a[0]开始向后扫,在以数字a[i]结 ...
- flask开发restful api系列(6)-配置文件
任何一个好的程序,配置文件必不可少,而且非常重要.配置文件里存储了连接数据库,redis的用户密码,不允许有任何闪失.要有灵活性,用户可以自己配置:生产环境和开发环境要分开,最好能简单的修改一个东西, ...
- office2003万能密钥
保证有效 OFFICE 2003 : GWH28-DGCMP-P6RC4-6J4MT-3HFDY
- CCAN:C语言的模块仓库
实践中一门编程语言是否有用.好不好,不仅体现在语言本身,更在语言的生态系统:用的人多不多.社区是否活跃互帮互助.语言的相关库和框架质量如何,还有就是已有的模块的质量与数量. CPAN(Comprehe ...