在写类模板时总是出error LNK2019: unresolved external symbol的原因

最近在将代码改成模板时出现一堆的error LNK2019: unresolved external symbol错误;

百度才发现类模板的声明和实现不能分开,要放在一个文件中,引用百度的说明原因;

“通常情况下,你会在.h文件中声明函数和类,而将它们的定义放置在一个单独的.cpp文件中。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。因此,最好的办法就是将模板的声明和定义都放置在同一个.h文件中。这就是为什么所有的STL头文件都包含模板定义的原因。”[1]

"标准要求编译器在实例化模板时必须在上下文中可以查看到其定义实体;而反过来,在看到实例化模板之前,编译器对模板的定义体是不处理的——原因很简单,编译器怎么会预先知道 typename 实参是什么呢?因此模板的实例化与定义体必须放到同一翻译单元中。"[1]


"《C++编程思想》第15章(第300页)说明了原因:
模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。
"[2]


"对C++编译器而言,当调用函数的时候,编译器只需要看到函数的声明。当定义类类型的对象时,编译器只需要知道类的定义,而不需要知道类的实现代码。因此,因该将类的定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。
       但在处理模板函数和类模板时,问题发生了变化。要进行实例化模板函数和类模板,要求编译器在实例化模板时必须在上下文中可以查看到其定义实体;而反过来,在看到实例化模板之前,编译器对模板的定义体是不处理的——原因很简单,编译器怎么会预先知道 typename 实参是什么呢?因此模板的实例化与定义体必须放到同一翻译单元中。
"[3]


一长串,没怎么看明白,直接看怎么弄吧  

 以下是模板声明和定义的两种方法:
1)可以通过在声明函数模板或类模板的头文件中添加一条#indlude指示定义可用,引入了包含相关定义的源文件。

//CANNBINARYBMP.H头文件

#pragma once
template<class T>
class CImageTemplate
{
protected:
private:
//function
bool isLineTransparent(CPOINT p1,CPOINT p2,bool bIsXLine);
T* catch_mode(CATCHMODE sCatchMode);
bool match_value(T *bpSPoint,int *pDposition,T *bpModeValue);
public:
void SlopeAdjust(double Slope);
float CalculateSlopebyHough();
VOID ImageDataConstruct(T w,T h);
};
#include "CANNBINARYBMP.cpp"
//<--------------------------添加这句把实现的CPP加进来
typedef CImageTemplate<INT> Cbinarybmp;


但这样又会引来"error C2995: 'CImageTemplate<T>::CImageTemplate(void)' : function template has already been defined"一堆以定义,这个可以处理下CPP文件如下:

#include "stdafx.h"
#ifndef _CANNCPP_//<--------------------------添加这句把实现的CPP加进来
#define _CANNCPP_

//cpp.源代码.....

#endif//<--------------------------添加这句把实现的CPP加进来

2)通过关键字export实现。
          C++理论上支持模板的分离编译(也就是支持export关键词),但是实际上VC2005,vs2010均不支持,在 VS 2008 中,export 关键字在 IDE 中被标蓝,表示 VS IDE 认识它,而编译时,会用警告友情提示你“不支持该关键字”。
3)当然就是将定义和实现文件写在一个文件中。

引用:"类模板和模板函数连接出错处理. http://www.cppblog.com/kenny/archive/2011/04/23/144841.html"

阅读更多
版权声明:本文为博主原创文章,转载请注明转载地址。 https://blog.csdn.net/flfihpv259/article/details/49665181
个人分类: error记录
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

在写类模板时总是出error LNK2019: unresolved external symbol的原因

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭