模板类的定义和实现不能分开,只能写在.h中,否则链接的时候会报错
2013-09-30 16:27
411 查看
遇到了这个问题。
连接的时候报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编程时的技巧之一。
连接的时候报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编程时的技巧之一。
相关文章推荐
- 定义和实现模板类不能在同一个文件
- 模板类成员函数的定义问题:函数实现不能定义在源文件中,一定要在头文件中
- C++如何实现只能动态分配类对象,不能定义类对象
- 嵌套类的成员函数(或静态成员)可以在嵌套类外定义,但不能在外围类中实现,只能在外围类之外实现。
- [C语言]除非该数组为全局变量,否则只能在定义数组时获取数组长度,在传递过程中只是传递指针不能再次获取长度
- 不能将模版类的定义与实现分别写在header文件和cpp文件中
- android-实现WebView只能滚动不能点击
- C#--关于事件的定义及注册,如何实现在一个文本框中只输入数字或者只能输入0至9十种数字、a至z或A至Z五十二种字符。
- 把程序的定义与实现部分用头文件与源文件分开
- C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟
- 为什么在头文件中只能放声明不能放定义
- C# 中如何实现TextBox控件只能输入数字,而不能是其他字符
- 模板类的定义和实现
- 点击tr实现选择checkbox功能,点击checkobx的时候阻止冒泡事件, jquery给checkbox添加checked属性或去掉checked属性不能使checkobx改变状态
- 在写<a>链接的href属性时 = 号 后面不能用空格,否则controller层接收不到参数值
- C++中命名空间内只能声明函数,不能定义
- WCF服务发布到IIS时候,只能根据hostname访问,不能根据IP地址访问的解决办法
- vsftp实现只能上传不能下载、删除权限配置
- @RequestBody 只能与@RequestHeader同用 不能与@RequestParam (实现迭代函数部分方法只调用一次,之后传递下去)
- 为什么不能分开模板的声明和定义,把定义放到.cpp文件中?