+ -
当前位置:首页 → 问答吧 → 无法解析的外部符号 "public: __thiscall SeqList<class Student>::SeqList<clas

无法解析的外部符号 "public: __thiscall SeqList<class Student>::SeqList<clas

时间:2011-12-26

来源:互联网

[code=C/C++][/code]
#ifndef EXESISE_H
#define EXESISE_H
#include<iostream>

using namespace std;

const int defaultSize=50;

class Student
{
private:
friend istream &operator>>(istream &in,Student &L);
friend ostream &operator<<(ostream &out,Student &L);
friend bool operator==(Student&L,Student&G);
char stu_name[20];
char stu_num[20];
int year;
int score;
};

template<class T>
class List
{
public:
List(){}
virtual int Size()const=0;
virtual int Length()const=0;
virtual int Search(T&x)const=0;
virtual int Locate(int i)const=0;
virtual bool getData(int i,T&x)const=0;
virtual void setData(int i,T&x)const=0;
virtual bool Insert(int i,T&x)=0;
virtual bool Remove(int i,T&x)=0;
virtual bool IsEmpty()const=0;
virtual bool IsFull()const=0;
virtual void input()=0;
virtual void output()=0;
};

template<class T>
class SeqList:public List<T>
{
public:
SeqList(int sz=defaultSize);
SeqList(SeqList<T>&L);
~SeqList(){delete[]data;}
int Size()const{return maxSize;}
int Length()const{return last+1;}
int Search(T&x)const;
int Locate(int i)const;
bool getData(int i,T&x)const
{
if(i>0&&i<=last+1)
{x=data[i-1];return true;}
else 
return false;
}
void setData(int i,T&x)const
{
data[i-1]=x;
}
bool Insert(int i,T&x);
bool Remove(int i,T&x);
bool IsEmpty()const
{
return (last==-1)?true:false;
}
bool IsFull()const
{
return (last==maxSize-1)?true:false;
}
void input();
void output();
protected:
T *data;
int maxSize;
int last;
void reSize(int newSize);
};

#endif;
————————————————————————————————————————————————————

#include"exesise.h"

template<class T>
SeqList<T>::SeqList(int sz)
{
if(sz>0)
{
maxSize=sz;
last=-1;
data=new T[maxSize];
if(NULL==data)
{
cerr<<"内存分配错误"<<endl;
exit(1);
}
}
}

template<class T>
SeqList<T>::SeqList(SeqList<T>&L)//const不能用在构造函数和析构函数
{
maxSize=L.Size();
last=L.Length()-1;
T value;
data=new T[maxSize];;
if(data==NULL)
{cerr<<"内存分配错误!"<<endl;exit(1);}
for(int i=1;i<=last+1;i++)
{
L.getData(i,value);
data[i-1]=value;
}
}

template<class T>
void SeqList<T>::reSize(int newSize)
{
if(newSize<=0)
{
cerr<<"无效数组大小"<<endl;
return;
}
if(newSize!=maxSize)
{
T*newarray=new T[newSize];
if(NULL==newarray)
{
cerr<<"内存分配错误"<<endl;
exit(1);
}
int n=last+1;
T*srcptr=data;
T*destptr=newarray;
while(n)
*destptr--=*srcptr--;
delete[]data;
data=newarray;
maxSize=newSize;
}
}


template<class T>
int SeqList<T>::Search(T&x)const
{
for(int i=0;i<last;i++)
{
if(data[i]==x)
return i+1;
}
return 0;
}

template<class T>
int SeqList<T>::Locate(int i)const
{
if(i>=1||i<=maxSize)
return i;
else
return 0;
}

template<class T>
bool SeqList<T>::Insert(int i,T&x)
{
if(last==maxSize-1)
return false;
if(i<0&&i>last+1)
return false;
for(int j=last;j>=i;j--)
data[j+1]=data[j];
data[i]=x;
last++;
return true;
}

template<class T>
bool SeqList<T>::Remove(int i,T&x)
{
if(last==-1)
return false;
if(i>last+1||i<1)
return false;
x=data[i-1];
for(int j=i-1;j<last;j++)
data[j]=data[j+1];
last--;
return true;
}

template<class T>
void SeqList<T>::input()
{
cout<<"建立顺序表,请输入表中的元素个数:";
while(1)
{
int input;
cin>>input;
last=input-1;
if(last<=maxSize-1)
break;
cout<<"表元素个数输入有误,范围不超过"<<maxSize-1<<":";
}
for(int i=0;i<=last;i++)
{
cin>>data[i];
}
}

template<class T>
void SeqList<T>::output()
{
for(int i=0;i<=last;i++)
cout<<"#"<<i+1<<":"<<data[i]<<endl;
}

istream &operator>>(istream &in,Student &L)
{
in>>L.stu_num;
in>>L.stu_name;
in>>L.year;
in>>L.score;
return in;
}

ostream &operator<<(ostream &out,Student &L)
{
out<<L.stu_num<<"\t"<<L.stu_name<<"\t"<<L.year<<"\t"<<L.score<<endl;
return out;
}

bool operator==(Student&L,Student&G)
{
if(strcmp(L.stu_name,G.stu_name)==0&&strcmp(L.stu_num,G.stu_num)==0&&L.score==L.score&&L.year==L.year)
return true;
else
return false;
}

——————————————————————————————————————————————
#include"exesise.h"//main.cpp
#include<iostream>

using namespace std;

int main()
{
List<Student>*pr;
pr=new SeqList<Student>(defaultSize);
pr->input();
pr->output();
return 0;
}
为什么
int main()
{
List<Student>*pr;
pr=new SeqList<Student>(defaultSize);
pr->input();
pr->output();
return 0;
}
放在exesise.cpp程序不报错,放在main.cpp就出现连接错误
"public: __thiscall SeqList<class Student>::SeqList<class Student>(int)" (??0?$SeqList@VStudent@@@@QAE@H@Z),该符号在函数 _main 中被引用

作者: idoing_xsf   发布时间: 2011-12-26

第一次发帖 不懂格式请大侠们谅解

作者: idoing_xsf   发布时间: 2011-12-26

估计是文件各种包含导致的错误

作者: yafeng_jiang   发布时间: 2011-12-26

不知道,一种情况把模版类的实现放在.h文件中,程序也可以运行,
另种情况把
int main()
{
 List<Student>*pr;
 pr=new SeqList<Student>(defaultSize);
 pr->input();
 pr->output();
 return 0;
}
放在exesise.cpp程序不报错,放在main.cpp就出现连接错误
用的vs2010困扰蛮久的问题 求解决!!!!!

作者: idoing_xsf   发布时间: 2011-12-26