报错:无法解析的外部符号 "public: __thiscall ···该符号在函数···中被引用”
// 一元多项式的求和.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 个无法解析的外部命令
相关推荐
C++常见错误及解决方案
C++调试等时常见的错误,以及解决方法,基本都可以在里面找到
C_C++函数符号生成规则(函数名的修饰);C++ 函数重载.pdf
C_C++函数符号生成规则(函数名的修饰);C++ 函数重载.pdf
C/C++函数调用的几种方式总结
本篇文章主要是对C/C++函数调用的几种方式进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
剖析C++函数调用约定
Visual C/C++的编译器提供了几种函数调用约定,了解这些函数调用约定的含义及它们之间的区别可以帮助我们更好地调试程序。在这篇文章里,我就和大家共同探讨一些关于函数调用约定的内容。 Visual C/C++的编译器支持如下的函数调用约定: 关键字 清理堆栈 参数入栈顺序 函数名称修饰(C) __cdecl 调用函数 右à 左 _函数名 __stdcall 被调用函数 右à 左 _函数名@数字 __fastcall 被调用函数 右à 左 @函数名@数字 thiscall(非关键字) 被调用函数 右à 左 /
函数调用约定与函数名称修饰规则
函数调用约定与函数名称修饰规则-很实用 使用C/C++语言开发软件的程序员经常碰到这样的问题:有时候是程序编译没有问题,但是链接的时候总是报告函数不存在(经典的LNK 2001错误),有时候是程序编译和链接都没有错误,但是只要调用库中的函数就会出现堆栈异常。这些现象通常是出现在C和C++的代码混合使用的情况下或在C++程序中使用第三方的库的情况下(不是用C++语言开发的),其实这都是函数调用约定(Calling Convention)和函数名修饰(Decorated Name)规则惹的祸。函数调用方式决定了函数参数入栈的顺序,是由调用者函数还是被调用函数负责清除栈中的参数等问题,而函数名修饰规则决定了编译器使用何种名字修饰方式来区分不同的函数,如果函数之间的调用约定不匹配或者名字修饰不匹配就会产生以上的问题。本文分别对C和C++这两种编程语言的函数调用约定和函数名修饰规则进行详细的解释,比较了它们的异同之处,并举例说明了以上问题出现的原因。


