模板函数声明在circList.h,而实现在circList.cpp,编译就会报错,原因为:模板函数在编译中就会实例化,把声明和定义分开,在一个编译单元内,及头文件展开后。在编译的时候虽然能找到函数声明,但是没有定义。
参考:http://blog.sina.com.cn/s/blog_5c8b05eb0100xzjg.html
关于c++ error LNK2019: unresolved external symbol 问题
我运行了一个程序,报出如下错:
Error 1 error LNK2019: unresolved external symbol "public: __thiscall CircList::CircList(int)" (??0?$CircList@N@@QAE@H@Z) referenced in function _wmain
Error 2 error LNK2019: unresolved external symbol "public: __thiscall CircList::~CircList(void)" (??1?$CircList@N@@QAE@XZ) referenced in function _wmain
Error 3 error LNK2019: unresolved external symbol "public: struct CircListNode * __thiscall CircList::Locate(int)" (?Locate@?$CircList@N@@QAEPAU?$CircListNode@N@@H@Z) referenced in function "void __cdecl Josephus(class CircList &,int,int,int)" (??$Josephus@N@@YAXAAV?$CircList@N@@HHH@Z)
Error 4 error LNK1120: 3 unresolved externals
程序代码如下:
#ifndef CIRCLIST_H_
#define CIRCLIST_H_
template <class T>
struct CircListNode{
T data;
CircListNode<T> * link;
};
template <class T>
class CircList{
private:
CircListNode<T> * first;
public:
CircList(){}
CircList(int i);
~CircList();
CircListNode<T> * Locate(int i);
};
#endif
#include "stdafx.h"
#include "circList.h"
#include <iostream>
using namespace std;
template<class T>
CircList<T>::CircList(int i)
{
T value;
first = new CircListNode < T > ;
for (int j = 0; j < i; j++)
{
CircListNode<T> * newNode = new CircListNode < T > ;
cout << "请输入第" << j + 1 << "个节点的值:";
getline(cin, value);
newNode->data = valude;
newNode->link = first->link;
first->link = newNode;
}
cout << "一个包含" << i << "个节点的循环表建立成功!" << endl;
}
template<class T>
CircList<T>::~CircList()
{
CircListNode<T> * q;
while (first->link != NULL)
{
q = first->link;
first->link = q->link;
delete q;
}
delete first;
}
template<class T>
CircListNode<T> * CircList<T>::Locate(int i)
{
CircListNode<T> * current = new CircListNode < T > ;
if (current == NULL)
{
cout << "内存分配错误!" << endl;
return NULL;
}
else
{
current = first->link;
for (int j = 1; j < i - 1; j++)
current = current->link;
return current;
}
}
// ex2-5.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include "circList.h"
using namespace std;
template<class T>
void Josephus(CircList<T> & js, int n, int s, int m);
int _tmain(int argc, _TCHAR* argv[])
{
int n, s, m;
cout << "请输入游戏人数、开始位置和报数间隔: ";
cin >> n >> s >> m;
CircList<double> clist(n);
Josephus(clist, n, s, m);
return 0;
}
template<class T>
void Josephus(CircList<T> & js, int n, int s, int m)
{
CircListNode<T> * p = js.Locate(s), *pre = NULL;
for (int i = 0; i < n - 1; i++)
{
for (int j = 1; j < m; j++)
{
pre = p;
p = p->link;
}
cout << "出列的人是" << p->data << endl;
pre->link = p->link;
p = pre->link;
}
}
求大神解释一下,谢谢了
- 点赞
- 写回答
- 关注问题
- 收藏
- 复制链接分享
- 邀请回答
4条回答
为你推荐
- VC6.0 错误LNK2001和LNK1120
- c++
- 2个回答
- 请问为什么出现LNK2019错误?
- c++
- 1个回答
- 什么是未定义的引用 / 未解析的外部符号错误? 如何修复它?
- c++
- visual studio
- 0个回答
- 类模板 重载输出符 unresolved external symbol
- c++
- 1个回答
- 帮忙解释一下这个是什么原因?
- c++
- 6个回答
- 关于程序在VC++6.0中不可运行
- c++
- 2个回答
- C++类中整形数组赋值问题。
- 如何调用dll中类的方法
- c++
- 2个回答
- c++类模板,调用结构体模板出错!!
- 1个回答
- 计算机图形学的问题,运行时编译成功,但是运行不出,老出以下错误
- c++
- 1个回答
- 程序原本可以运行,是控制台的。现在没法用了。
- c++
- 2个回答
- 如何在一个A.cpp程序下调用另一个B.cpp下的变量
- c++
- 1个回答
- 软件Visual C++ 6怎么利用MFC编写Windows控制台应用程序,帮忙补下代码
- 编译时出现这样的错误,求大神指点解决方法
- c++
- 2个回答