在VC/VS中使用模板成员函数时,出现LNK2001错误
2014-03-13 00:22
399 查看
今天第一次尝试着使用了泛型编程,结果出现了LNK2001错误。当我焦头烂额地调了两个小时之后,在微软的帮助和支持文章中貌似发现了问题的所在。
先说说我遇到的问题吧。
和普通的封装练习没有什么区别,就是写个链表的封装。只不过这一次想试试泛型编程。
部分代码:
当main函数什么都没有的时候,编译结果一切正常。可是当我打算在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
并实现在Myprog.cpp中,以下显式实例化MyStackint变量:
文章编号: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
于成都
先说说我遇到的问题吧。
和普通的封装练习没有什么区别,就是写个链表的封装。只不过这一次想试试泛型编程。
部分代码:
//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中的代码,放到头文件中后,问题就解决了。
于是就猜测是不是模块化链接的错...
自己随意猜测是没有用处的。看一看微软的帮助文章是怎么说的吧:
当您使用模板成员函数时,您会收到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
于成都
相关文章推荐
- 模板类中可以使用虚函数吗?模板成员函数可以是虚函数吗?
- 读书笔记 effective c++ Item 45 使用成员函数模板来接受“所有兼容类型”
- 关于类成员函数在模板中的使用
- 如何解决标准C库的函数在vs上使用时出现的警告
- VS2013 bug : 无法使用std::function包装成员函数
- 在VS2013 使用C语言库函数,出现出现错误,提示使用不安全函数use _CRT_SECURE_NO_WARNINGS
- VC++基础 函数模板的使用
- Item 45:使用成员函数模板来接受所有兼容的类型
- 使用VS 2008(带sp1)编译VC 6.0的一个工程,出现下面的编译错误
- 关于类成员函数在模板中的使用
- XP 安装后使用vc2010,进入类视图后,点击一个函数,后vs报错退出问题
- 不使用汇编在vc中转换类的成员函数为一个线程的通用代码
- VS中使用VC资源编辑器添加变量或事件处理程序出现脚本错误的解决办法
- error C2668: “sqrt”: 对重载函数的调用不明确这些出现在使用vs 2008 2010时候碰到调用sqrt 之类的数学模型函数
- Item 45:使用成员函数模板来接受所有兼容的类型
- C++模板技术之method_thunk, 使用场景: C++中类成员函数作为回调函数
- vc++ 成员函数的使用
- vs2005中使用模板出现"LNK2019 - Unresolved external Symbol" 错误
- 一个使用mutable修改const成员函数的栗子
- boost thread 使用类的非静态成员函数做线程函数之【原理】