C++ 模板类的实现为何放在.h中

主要原因:C++标准明确表示,当一个模板不被用到的时侯它就不该被实例化出来;

如以下代码:main.cpp中调用到模板类A的方法A<int>::f,因A<int>::f在test.cpp中实现,编译器在#1处并不知道A<int>::f的定义,故寄希望于连接器,实际上test.cpp编译出来的test.obj文件中关于A::f一行二进制代码也没有,因为模板类A在test.cpp未被实例化,此时连接器就会报错。所以,必须把模板类的实现放在.h中,此时main.cpp中调用A<int>::f方法时,就可直接打到f的定义了。

1. //-------------test.h----------------//  
2.        
3. template<classT>  
4.        
5. classA  
6.        
7. {  
8.        
9. public:  
10.        
11. voidf(); // 这里只是个声明  
12.        
13. };  
14.        
15. //---------------test.cpp-------------//  
16.        
17. #include”test.h”  
18.        
19. template<classT>  
20.        
21. voidA<T>::f() // 模板的实现  
22.        
23. {  
24.        
25. …//do something  
26.        
27. }  
28.        
29. //---------------main.cpp---------------//  
30.        
31. #include”test.h”  
32.        
33. intmain()  
34. {  
35.     A<int> a;  
36.     a.f(); // #1  
37. }

时间: 2024-11-05 13:41:59

C++ 模板类的实现为何放在.h中的相关文章

C++模板类注意事项

最近使用C++模板,虽然工作几年了,但是模板用的很少,确切的说自己实现的机会很小. 昨天写了一个代码maxheap.h 中实现了类模板的声明,我将实现写在maxheap.cpp中, 当在main.cpp中引用maxheap中的接口时,提示链接错误.网上提供了几个解决方案, 第一种方式是将maxheap.h和maxheap.cpp包含在某个.h文件中,这样在main函数中 包含这个.h即可.第二种方式叫分离模式,我没看,觉得没必要搞得那么复杂.第三种方式 是我最看好的方式,就是将模板类的实现也放在

C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?

原文  http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++ C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果你忘记了或是压根就不明白,那么读过此文你会清晰无比!! 首先谈下 声明与定义的区别. 声明是将一个名称引入程序.定义提供了一个实体在程序中的唯一描述.声明和定义有时是同时

数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现,编译模板类问题解决

[本文谢绝转载原文来自http://990487026.blog.51cto.com] 数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现 C++ 顺序存储模板类的实现[面试重要] C++ 链式存储模板类的实现[面试重要] C++ 链式存储模板类,载入指针 c++ 栈的链式存储实现(模板类嵌套模板类),编译问题教训[重要] C++ 顺序存储模板类的实现[面试重要] 项目文件: [email protected]://990487026.blog.51cto.com~/c++$ tree .

一个数组类【模板类】

这学期的大作业感觉挺简单的,就是写一个模板类MyList,实现一些Python中的list的操作(类似于c++中的vector,但是不支持迭代器).这些功能都很简单,唯一麻烦的就是模板类特别烦,特别是友元函数,首先要声明这个类,然后声明是函数的声明,然后是类中友元函数的声明,最后是实现.友元函数的声明还有一个问题就是声明时在函数名后面要加上一个<>就像这样: friend void Qsort<>(T a[],int low,int high,bool less); 还有一个要注意

C++提高1 【泛型编程】函数模板 类模板

[本文谢绝转载] [泛型编程] 函数模板 为什么会有函数模板 现象: 函数的业务逻辑一样 函数的参数类型不一样 [最常用]函数模板  显式的调用 [不常用]类型推导 多个参数,参数定义了必须要用 函数模板,实现int类型数组,char字符串排序: 函数模板 与 普通函数的本质区别 函数模板 和 普通函数在一起 的调用型研究: C++是如何支持函数模板机制的? 函数模板机制结论 类模板 类模板的定义 类模板做函数的参数 类模板的派生成普通类 模板类的派生成模板类 复数类,所有函数都写在类的内部,运

怎样用boost::serialization去序列化派生模板类

本篇是boost::serialization 用基类指针转存派生类(错误多多,一波三折)的姊妹篇,这里只不过做一个总结. 先来看一个基类 class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_data() = 0; protected: int base_member_; //other member... }; 它的一个模板

【转】模板类的声明与实现必须同时放在头文件中

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:余天升链接:http://www.zhihu.com/question/20630104/answer/15722407来源:知乎 模板类的实现,脱离具体的使用,是无法单独的编译的:把声明和实现分开的做法也是不可取的,必须把实现全部写在头文件里面.为了清晰,实现可以不写在class后面的花括号里面,可以写在class的外面. 解释: C++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,

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

http://www.cnblogs.com/lvdongjie/p/4288373.html 如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关. 引用<<C++primer(第四版)>>里的观点:1)标准C++为编译模板代码定义了两种模型:"包含"模型和"分别编译"模型.2)所有编译器都支持"包含"模型,某些编译器支持"分别编译"模型. 问题的提出:(帖子在:http://topic.c

函数模板与模板函数及模板类与模板的特化

函数模板( Function templates) * 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载.这在一定程度上实现了宏(macro)的作用.它们的原型定义可以是下面两种中的任何一个: template <class identifier> function_declaration; template <typename identifier> function_decla