您的位置:首页 > 其它

在VC/VS中使用模板成员函数时,出现LNK2001错误

2014-03-13 00:22 399 查看
今天第一次尝试着使用了泛型编程,结果出现了LNK2001错误。当我焦头烂额地调了两个小时之后,在微软的帮助和支持文章中貌似发现了问题的所在。

先说说我遇到的问题吧。

和普通的封装练习没有什么区别,就是写个链表的封装。只不过这一次想试试泛型编程。

部分代码:

//LinkedList.h
#pragmaonce

#include"Node.h"
#include<iostream>

usingnamespacestd;

//链表类
template<typenameT>
classLinkedList
{
public:
LinkedList();
LinkedList(T);
~LinkedList();
......
protected:
......
};
//LinkedList.cpp
#include"LinkedList.h"
//构造、析构函数
template<typenameT>LinkedList<T>::LinkedList():length(0),head(NULL),rear(NULL){}

template<typenameT>LinkedList<T>::LinkedList(Te):length(1)
{
Node<T>*node=newNode<T>(e,NULL,NULL);
this->head=node;
this->rear=node;
}

template<typenameT>LinkedList<T>::~LinkedList(){}

当main函数什么都没有的时候,编译结果一切正常。可是当我打算在main函数中做些测试时,问题就发生了...
//main.cpp很简单的测试
#include"LinkedList.h"
voidmain()
{
LinkedList<char>l('a');
}
1>main.obj:errorLNK2019:无法解析的外部符号"public:__thiscallLinkedList<char>::~LinkedList<char>(void)"(??1?$LinkedList@D@@QAE@XZ),该符号在函数_main中被引用
1>main.obj:errorLNK2019:无法解析的外部符号"public:__thiscallLinkedList<char>::LinkedList<char>(char)"(??0?$LinkedList@D@@QAE@D@Z),该符号在函数_main中被引用

==||

为了这个,我一直胡乱搞了很长时间。这中间发现,如果把定义代码,即LinkedList.cpp中的代码,放到头文件中后,问题就解决了。

于是就猜测是不是模块化链接的错...

自己随意猜测是没有用处的。看一看微软的帮助文章是怎么说的吧:

http://support.microsoft.com/kb/239436/zh-cn

当您使用模板成员函数时,您会收到LNK2001错误消息(PS:机器翻译)
本文以前公布在Q239436下
症状:
除非成员函数还定义了相同的翻译单元中,您将收到LNK2001错误消息模板成员函数上。

原因:
编译器不支持所指定下面的标准c++中的"导出"关键字的使用:
第14节
段#7:声明类模板导出等于声明所有其非内联函数成员,静态数据成员、成员的类,类模板的成员和非内联函数成员模板的翻译单元中定义的导出。

段#8:使用未命名的命名空间中定义的模板将不会被导出。应在程序中一次只能导出模板。实现不需要诊断此规则的冲突。非导出,是既不能显式专用化和显式实例化的模板必须定义每个翻译单元中它是隐式地实例化(temp.inst)或显式实例化(temp.explicit);没有诊断程序是必需的。已导出的模板只需要声明
(并不一定是定义)中的实例化一个翻译单元。模板函数声明同时导出和内联是不仅仅是内联,不导出。

解决方案:
您有以下两个选项:
1.将模板声明和定义放在一个翻译单元。
2.如果事先知道将如何在应用程序中使用您的模板类,您还可以显式实例化的模板类。

例如,类的MyStack声明中Myprog.h


template<classT>MyStack;


并实现在Myprog.cpp中,以下显式实例化MyStackint变量:


templateclassMyStack<int>;


文章编号:239436-最后修改:2014年2月23日
这篇文章中的信息适用于:

MicrosoftVisualC++5.0企业版
MicrosoftVisualC++6.0企业版
MicrosoftVisualC++5.0专业版
MicrosoftVisualC++6.0专业版
MicrosoftVisualC++,32-bitLearningEdition6.0
MicrosoftVisualC++2005ExpressEdition
MicrosoftVisualC++.NET2003StandardEdition
MicrosoftVisualC++.NET2002标准版

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以上。我用的可是VS2010啊,怎么还有这样的问题...
虽然我只是知其表面,但仍希望能够帮到和我遇到一样问题的人,与诸君共勉。

2014-03-13
于成都
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: