模板类的定义和实现不能分开,只能写在.h中,否则链接的时候会报错
来源:互联网 发布:apache tomcat 编辑:程序博客网 时间:2024/04/28 16:46
遇到了这个问题。
连接的时候报ld: 0711-317 ERROR: Undefined symbol:
网上查的的解决方法:
http://bbs.csdn.net/topics/70416260
注意c/c++模板的定义和实现- -
定义一个类一般都是在头文件中进行类声明,在cpp文件中实现,但使用模板时应注意目前的C++编译器还无法分离编译,最好将实现代码和声明代码均放在头文件中。如:
test.h
template<class T>class CTest{ public: T& GetValue(); void SetValue(const T& _Value);protected: T m_Value; };
test.cpp
template<class T>T& CTest<T>::GetValue(){ return m_Value; }template<class T>void CTest<T>::SetValue(const T& _Value){ m_Value = _Value; }
在这儿test.cpp中的内容应放在test.h中,否则在生成最终可执行程序时就会出现错误(在链接时会出错)。因为在编译时模板并不能生成真正的二进制代码,而是在编译调用模板类或函数的CPP文件时才会去找对应的模板声明和实现,在这种情况下编译器是不知道实现模板类或函数的CPP文件的存在,所以它只能找到模板类或函数的声明而找不到实现,而只好创建一个符号寄希望于链接程序找地址。但模板类或函数的实现并不能被编译成二进制代码,结果链接程序找不到地址只好报错了。
《C++编程思想》第15章(第300页)说明了原因:模板定义很特殊。由template<…>处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。
沈公子在 2005年2月15日11:19星期二 评论:
你说的有误,要将实现代码放在cpp文件中,否则编译时所有包含头文件的单元都要额外的编译时间。
只要在实现中的模板函数之前加上export就可以避免你说的链接错误,这是STL编程时的技巧之一。
- 模板类的定义和实现不能分开,只能写在.h中,否则链接的时候会报错
- 模板函数的声明和定义为何不能分开放在两个文件中?
- c++模板的定义和实现为啥分开
- 关于类模板中类定义不能分离成.cpp和.h文件的原因
- 模板类:函数实现(.cpp)和函数声明(.h)分开的问题
- 不能将类模板的声明与实现分开写
- 复数类_所有函数都写在类的外部(h和cpp分开)
- 请将类模板的声明和实现都写在.h文件中
- C++中,类和函数分开定义声明和实现的方法
- C++模板中声明和定义是否可以分开存放在.h和.cpp文件中
- 模板类和模板函数的声明和定义分开文件写的方法
- JSONObject与JSONArray的使用时候注意引用的jar包,否则会报错
- mysql DDL 创建的时候 前面一定要加上判断(if exists) 否则会报错的。
- c/c++模板的定义和实现分开的问题(一)
- 为什么不能将类模板的声明与类模板函数实现分开写
- 为什么不能将类模板的声明与类模板函数实现分开写
- 为什么不能将类模板的声明与类模板函数实现分开写?
- 模板类的定义和声明为何要写在一起
- [log4j] annotation
- Oracle 11G函数整理(数值函数)
- windows 捕获摄像头1
- 文件编码问题集锦
- linux buffer 与 cache 的区别
- 模板类的定义和实现不能分开,只能写在.h中,否则链接的时候会报错
- vim 学习
- Win7下修改hosts文件
- android之init进程-uevent
- DWR使用总结
- Memcached代理服务器软件:magent使用
- ubuntu安装GraphicsMagick
- 为什么新生代有两个survivor?
- POJ 2309树状数组的简单变型