C++输出运算符重载函数模板报错

//单链表类头文件#ifndef_dlblmb_h#define_dlblmb_h#include<iostream>usingnamespacestd;//节点、链表类... //单链表类头文件
#ifndef _dlblmb_h
#define _dlblmb_h
#include<iostream>
using namespace std;

//节点、链表类模板,输出函数模板声明
template<class T> class Node;
template<class T> class Linklist;
template<class TT> ostream& operator<<(ostream&,const Linklist<TT>&);

//定义节点类模板
template<class T>
class Node{
friend ostream& operator<<(ostream&,const Linklist<T>&);
friend class Linklist<T>;
private:
T value;
Node<T>* next;
public:
Node(T& v,Node<T>* n=NULL):value(v),next(n){}
Node():next(NULL){}
};

//定义链表类模板
template<class T>
class Linklist{
friend ostream& operator<<(ostream&,const Linklist<T>&);
protected:
Node<T>* head;
public:
Linklist(){head=new Node<T>;}
~Linklist();
void create(const T& flag);
};

//creat函数定义
template<class T>
void Linklist<T>::create(const T& flag){
T tmp;
Node<T> *p,*last=head;
cout<<"请输入链表数据,"<<flag<<"表示结束"<<endl;
while(1){
cin>>tmp;
if(flag==tmp) break;
p=new Node<T>(tmp);//申请新空间
last->next=p;//将前一个结点next指向后一个结点
last=p;//结点last指向新申请空间
}
}

//链表类析构函数定义
template<class T>
Linklist<T>::~Linklist(){
Node<T> *p=head,*q;
while(p){
q=p->next;//释放前一个结点之前记录其next
delete p;//释放当前结点
p=q;//将p指向下一个结点
}
}

//输出运算符重载定义
template<class TT>
ostream& operator<<(ostream& os,const Linklist<TT>& obj){
Node<TT>* p=obj.head;
while(p){
os<<p->value<<" ";
p=p->next;
}
os<<endl;
return os;
}

#endif

//应用
#include"dlblmb.h"
void main(){
Linklist<int> intlist;
intlist.create(0);
// cout<<intlist;
}

当使用cout<<intlist就报错
1>123.obj : error LNK2001: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Linklist<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Linklist@H@@@Z)
1>C:\Users\fangpeng\Desktop\dlblmb\Debug\dlblmb.exe : fatal error LNK1120: 1 unresolved externals

将其注释掉编译通过,求问题所在,谢谢!
展开
 我来答
百度网友4e923b8
2017-07-04 · TA获得超过132个赞
知道小有建树答主
回答量:120
采纳率:0%
帮助的人:8.7万
展开全部

这两个位置都加上变量名试试。ostream & operator<<(ostream& os,const Linklist<T>&);

追问
声明应该无所谓加不加....
现在知道了,插入运算符重载声明时在operator就行了,变成
friend ostream& operator(ostream& ,const Linklist&);
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式