报错:无法解析的外部符号 "public: __thiscall ···该符号在函数···中被引用”

shenqi67 2012-04-07 11:21:41
// 一元多项式的求和.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
//#include "LinkList.h" //如果在LinkList.h中没有#pragma once此行必须注释掉 ,因为PolyList.h已经包含了
#include "PolyList.h"
/*#include <iostream>
using namespace std;*/
//由于主函数包含了PolyList.h,它包含了LinkList.h,而LinkList.h又包含了#include <iostream>,
//所以可以不再包含<iostream>
//之所以可以在包含<iostream>是因为<iostream>里只有申明部分,没有变量或函数的定义,在生成的二进制
//可执行文件中不会产生相同的函数或变量。



int _tmain(int argc, _TCHAR* argv[])
{
element a[]={element(1,0),element(2.3,2),element(3,4)};
element b[]={element(1,1),element(-2.3,2),element(3,4),element(5,10),element(5,100)};
PolyList lista(a,3);
PolyList listb(b,5);
listb.Add(lista);
listb.PrintList();

return 0;
}

/**LinkList.h*/

//#pragma once //此程序中可以注释掉此行
#include<iostream>
using namespace std;

template<class T>
struct Node
{
T data;
struct Node<T>* next;
};

struct element
{
double coef;
int exp;
element(double c=0,int e=0):coef(c),exp(e){}
};

template<class T>
class LinkList
{
protected:
Node<T> *front;
public:
LinkList();
LinkList(T a[], int n);
//virtual void PrintList();
Node<T> * GetFirst();
};

//template<class T>
//LinkList<T>::LinkList()
//{
// front = new Node<T>;
// front->next = NULL;
//}
//
//template<class T>
//LinkList<T>::LinkList(T a[],int n)
//{
// front = new Node<T>;
// front->next = NULL; //初始化
//
// for(int i=n-1;i>=0;i--)
// {
// Node<T> *p = new Node<T>;
// p->data=a[i];
// p->next = front->next;
// front->next = p;
// }
//}
//
//template<class T>
//Node<T> *LinkList<T>::GetFirst()
//{
// return front;
//}

/**LinkList.cpp*/

#include "StdAfx.h"
#include "LinkList.h"

template<class T>
LinkList<T>::LinkList()
{
front = new Node<T>;
front->next = NULL;
}

template<class T>
LinkList<T>::LinkList(T a[],int n)
{
front = new Node<T>;
front->next = NULL; //初始化

for(int i=n-1;i>=0;i--)
{
Node<T> *p = new Node<T>;
p->data=a[i];
p->next = front->next;
front->next = p;
}
}

template<class T>
Node<T> *LinkList<T>::GetFirst()
{
return front;
}

/**PolyList.cpp*/

#include "StdAfx.h"
#include "PolyList.h"
#include<cmath>


PolyList::PolyList():LinkList()
{
}
PolyList::~PolyList()
{
}

PolyList::PolyList(element data[], int n):LinkList(data,n)
{
}

void PolyList::Add(PolyList &B)
{
Node<element> *p_prior = GetFirst();
Node<element> *p = p_prior->next;
Node<element> *q = B.GetFirst()->next;//初始化

while(p&&q)
{
if(p->data.exp < q->data.exp)
{
p_prior = p;
p = p->next;
}
else if(p->data.exp > q->data.exp)
{
p_prior->next = q;
p_prior = q;
q = q->next;
p_prior->next = p;
}
else
{
p->data.coef += q->data.coef;
if(fabs(p->data.coef) < 1e-7)
{
p_prior->next = p->next;
delete p;
p = p_prior->next;
}
else
{
p_prior = p;
p = p_prior->next;
}

Node<element> *temp = q;
q = q->next;
delete temp;
}
}
if(q) p_prior->next = q;
B.GetFirst()->next = NULL;
}

void PolyList::PrintList()
{
Node<element> *p = front;
while(p->next)
{
cout <<"(" << p->next->data.coef<<","<< p->next->data.exp << ")";
p = p->next;
}
cout << endl;
}

/**PolyList.h*/
#pragma once //此程序中可以注释掉此行
#include "linklist.h"

class PolyList :
public LinkList<element>
{
public:
PolyList();
PolyList(element data[], int n);
~PolyList();

void Add(PolyList &B);
void PrintList();
};

报错:1>PolyList.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall LinkList<struct element>::LinkList<struct element>(void)" (??0?$LinkList@Uelement@@@@QAE@XZ),该符号在函数 "public: __thiscall PolyList::PolyList(void)" (??0PolyList@@QAE@XZ) 中被引用
1>PolyList.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall LinkList<struct element>::LinkList<struct element>(struct element * const,int)" (??0?$LinkList@Uelement@@@@QAE@QAUelement@@H@Z),该符号在函数 "public: __thiscall PolyList::PolyList(struct element * const,int)" (??0PolyList@@QAE@QAUelement@@H@Z) 中被引用
1>PolyList.obj : error LNK2019: 无法解析的外部符号 "public: struct Node<struct element> * __thiscall LinkList<struct element>::GetFirst(void)" (?GetFirst@?$LinkList@Uelement@@@@QAEPAU?$Node@Uelement@@@@XZ),该符号在函数 "public: void __thiscall PolyList::Add(class PolyList &)" (?Add@PolyList@@QAEXAAV1@@Z) 中被引用
1>C:\Users\shenqi67\documents\visual studio 2010\Projects\一元多项式的求和\Debug\一元多项式的求和.exe : fatal error LNK1120: 3 个无法解析的外部命令
...全文
2437 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
evencoming 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

我把LinkList.cpp里的全部注释,改为在LinkList.h里实现,就不报错了!为什么呀?
[/Quote]
对了,因为模板没法实现 声明和定义分离.
所以有使用到模板的定义都必须放到.h里面..
shenqi67 2012-04-08
  • 打赏
  • 举报
回复
我把LinkList.cpp里的全部注释,改为在LinkList.h里实现,就不报错了!为什么呀?
evencoming 2012-04-08
  • 打赏
  • 举报
回复
这种连接错误一般都是有声明,而没定义导致的.
你仔细检查一下声明和定义有没有遗漏.

(如果找不出来发完整代码,我明天看看,今天困了)
shenqi67 2012-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

//template<class T>
//Node<T> *LinkList<T>::GetFirst()
//{
// return front;
//}

那你注释多了
[/Quote]注释的地方在实现函数里有的
LLionTree 2012-04-08
  • 打赏
  • 举报
回复
你使用了预编译头 #include "stdafx.h",所以可以实现声明和实现的分离,也就是源文件和头文件的分离,上面的报错主要可能是由于某些函数声明了,但未定义,关键是在主程序中引用了这些函数,如果没有引用,编译是可以通过的。
evencoming 2012-04-07
  • 打赏
  • 举报
回复
//template<class T>
//Node<T> *LinkList<T>::GetFirst()
//{
// return front;
//}

那你注释多了
evencoming 2012-04-07
  • 打赏
  • 举报
回复
因为那几个函数没有实现吧...
GetFirst
LinkList(struct element* const ,int)
之前你的是下面的构造函数
template<class T>
LinkList<T>::LinkList(T a[],int n);
而你调用的时候是上面的那个(LinkList(struct element* const ,int)).
注意 const的问题

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧