c++的类中的指针函数的定义及调用有关问题!求大神指点
c++的类中的指针函数的定义及调用问题!求大神指点~
程序一直显示类中的函数没有定义,但是明明定义过了,想不通,求大神指点~
程序如下:
list.h:
#include<iostream>
#include<fstream>
using namespace std;
template <class T>
class link;
template <class T>
class list
{
private:
T data;
list<T> *next;
list<T> *head;
public:
// list(T & data,list<T> *next);
// list(list<T> & p);
friend class link;
};
template <class T>
class link
{
public:
// link(){};
// link(link<T> & p);
// ~link();
typename list<T> *creat(list<T> *head);
void show(link<T> *head);
};
list.cpp
#include<iostream>
#include"list.h"
using namespace std;
/****************************************************
函数名: list<T> *creat(link<T> *head);
函数功能: 创建链表并添加数据;
输入: data;
输出: *head;
****************************************************/
/* template <class T>
typename list<T> link<T>::*creat(list<T> *head)
{
int n=0;
list<T> *p1,*p2; //创建指针并申请内存;
p1=new list<T>;
p2=new list<T>;
cout<<"请输入结点数据:"<<endl;
cin>>p1->data;
head=NULL;
while(p1->data != 0) //当输入数据为零时认为所有数据输入完毕,停止继续输入;
{
n=n+1;
if(n == 1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=new list<T>;
cout<<"请输入结点数据:"<<endl;
cin>>p1->data;
}
p2->next=NULL;
return(head);
}
main.cpp:
#include<iostream>
#include"list.h"
using namespace std;
void main()
{
int a=1;
link<int> q;
list<int> *t,*s;
while(a>0 && a<11)
{
cout<<"请选择要进行的操作:"<<endl;
cout<<"1、创建链表。 2、显示链表。"<<endl;
cout<<"3、最大数据。 4、最小数据。"<<endl;
cout<<"5、查找结点。 6、删除特定数据。"<<endl;
cout<<"7、升序输出。 8、降序输出。"<<endl;
cout<<"9、结点总数。 10、退出。"<<endl;
cin>>a;
switch(a){
case 1:
s=q.creat(t); //创建链表;
break;
default:
cout<<"请重新选择!"<<endl;
break;
}
}
return ;
}
显示:
main.obj : error LNK2001: unresolved external symbol "public: class list<int> * __thiscall link<int>::creat(class list<int> *)" (?creat@?$link@H@@QAEPAV?$list@H@@PAV2@@Z)
Debug/LIST.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

------解决思路----------------------
应该是typename惹出来的问题。
------解决思路----------------------
模板类的实现要跟声明放一起,楼主都放到.h文件中
------解决思路----------------------
模板类跟普通的不一样,因为模板类在编译的时候,未确定类型的时候,这个类其实是不能确定的,如果你有个地方只是引用了头文件,编译器只能确定它的声明罢了,至于类的实现,又在哪里?
如果只是看模板类的CPP代码,只有一对template<T>,这个T是什么类型,编译器又怎么编译?
至于放在一起还出错,那就是其它问题了,并不是说不放在一起就正确了
------解决思路----------------------
再次确认了下...typename 仅仅用在 nested dependent type name 前,其他情况下not allowed,因此在这个例子中,还是不应该使用的
程序一直显示类中的函数没有定义,但是明明定义过了,想不通,求大神指点~
程序如下:
list.h:
#include<iostream>
#include<fstream>
using namespace std;
template <class T>
class link;
template <class T>
class list
{
private:
T data;
list<T> *next;
list<T> *head;
public:
// list(T & data,list<T> *next);
// list(list<T> & p);
friend class link;
};
template <class T>
class link
{
public:
// link(){};
// link(link<T> & p);
// ~link();
typename list<T> *creat(list<T> *head);
void show(link<T> *head);
};
list.cpp
#include<iostream>
#include"list.h"
using namespace std;
/****************************************************
函数名: list<T> *creat(link<T> *head);
函数功能: 创建链表并添加数据;
输入: data;
输出: *head;
****************************************************/
/* template <class T>
typename list<T> link<T>::*creat(list<T> *head)
{
int n=0;
list<T> *p1,*p2; //创建指针并申请内存;
p1=new list<T>;
p2=new list<T>;
cout<<"请输入结点数据:"<<endl;
cin>>p1->data;
head=NULL;
while(p1->data != 0) //当输入数据为零时认为所有数据输入完毕,停止继续输入;
{
n=n+1;
if(n == 1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=new list<T>;
cout<<"请输入结点数据:"<<endl;
cin>>p1->data;
}
p2->next=NULL;
return(head);
}
main.cpp:
#include<iostream>
#include"list.h"
using namespace std;
void main()
{
int a=1;
link<int> q;
list<int> *t,*s;
while(a>0 && a<11)
{
cout<<"请选择要进行的操作:"<<endl;
cout<<"1、创建链表。 2、显示链表。"<<endl;
cout<<"3、最大数据。 4、最小数据。"<<endl;
cout<<"5、查找结点。 6、删除特定数据。"<<endl;
cout<<"7、升序输出。 8、降序输出。"<<endl;
cout<<"9、结点总数。 10、退出。"<<endl;
cin>>a;
switch(a){
case 1:
s=q.creat(t); //创建链表;
break;
default:
cout<<"请重新选择!"<<endl;
break;
}
}
return ;
}
显示:
main.obj : error LNK2001: unresolved external symbol "public: class list<int> * __thiscall link<int>::creat(class list<int> *)" (?creat@?$link@H@@QAEPAV?$list@H@@PAV2@@Z)
Debug/LIST.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.
------解决思路----------------------
应该是typename惹出来的问题。
------解决思路----------------------
模板类的实现要跟声明放一起,楼主都放到.h文件中
------解决思路----------------------
模板类跟普通的不一样,因为模板类在编译的时候,未确定类型的时候,这个类其实是不能确定的,如果你有个地方只是引用了头文件,编译器只能确定它的声明罢了,至于类的实现,又在哪里?
如果只是看模板类的CPP代码,只有一对template<T>,这个T是什么类型,编译器又怎么编译?
至于放在一起还出错,那就是其它问题了,并不是说不放在一起就正确了
------解决思路----------------------
typename list<T> link<T>::*creat(list<T> *head)
你能不能把*和类型放在一起?
typename list<T>* link<T>::creat(list<T> *head)
还有这行前面的
/* template <class T>
这注释都没有闭合,你确定后面的代码参与了编译?
另外,你完全错误的使用了模板类,中间那么多typename是什么情况,先照着书上的示例编程,把格式熟悉了先啊
这里我错了, typename用了不会有错,但是不用也不会有错(在这个情况下)
再次确认了下...typename 仅仅用在 nested dependent type name 前,其他情况下not allowed,因此在这个例子中,还是不应该使用的