模板问题,重载 "<<"
#include<iostream>
using namespace std;
template <class type> class queueitem;
template <class type> class queue;
template <class type>
ostream& operator<< (ostream &os,const queue<type> &q)
{
os<<"<";
queueitem<type> *p=q->head;
for(;p;p=p->next)
os<<p->item<<" ";
os<<">";
return os;
}
template<class type>
class queue
{
public:
friend ostream &operator<< <type>(ostream &os,queue<type> &q);
queue():head(0),tail(0){}
queue(const queue& q):head(0),tail(0){}
queue& operator=(const queue&);
~queue(){destroy();}
type& front(){return head->item;}
const type& front() const{return head->item;}
void push(const type&);
void pop();
bool empty() const{return 0==head;}
private:
queueitem<type>* head;
queueitem<type>* tail;
void destroy();
void copy_elem(const queue&);
};
template <class type> class queueitem
{
friend class queue<type>;
/*friend ostream &operator<<(ostream &os,queueitem<type> &q);*/
queueitem(const type& t):item(t),next(0){}
type item;
queueitem* next;
};
template<class type> void queue<type>::destroy()
{
while(!empty())
pop();
}
template<class type> void queue<type>::pop()
{
queueitem<type>* p=head;
head=head->next;
delete p;
}
template<class type> void queue<type>::push(const type &val)
{
queueitem<type>* pt=new queueitem<type>(val);
if(empty())
head=tail=pt;
else
{
tail->next=pt;
tail=pt;
}
}
template<class type>
void queue<type>::copy_elem(const queue &orig)
{
for(queueitem<type>* pt=orig.head,pt;pt=pt->next)
push(pt->item);
}
template<class type>
queue<type>& queue<type>::operator =(const queue& now)
{
for(queueitem<type>* pt=now.head;pt;pt=pt->next)
this->push(pt->item);
return *this;
}
void main()
{
queue<int> a;
a.push(1);
a.push(2);
queue<int>b;
b=a;
cout<<a;
}
cout<<a;出错。
test.obj : error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl <<(class std::basic_ostream<char,struct std::char_traits<char> > &,class queue<int> &)" (?<<@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV12@AAV?$queue@H@@@Z),该符号在函数 _main 中被引用
1>D:\新建程序\t\Debug\t.exe : fatal error LNK1120: 1 个无法解析的外部命令
求解答
[解决办法]
template <class type> class queueitem;template <class type> class queue;template <class type> ostream& operator<< (ostream &os,const queue<type> &q){os<<"<";queueitem<type> *p=q->head; for(;p;p=p->next)os<<p->item<<" ";os<<">";return os;}template<class type>class queue{ public:template<class S> friend ostream &operator<< (ostream &os,queue<S> &q);
[解决办法]
各种私有域的问题。。重载<<函数的第二个参数声明少了const。
修改后能运行的版本如下,好多private被我改成public才通过了。
#include<iostream>using namespace std;template <class type> class queueitem;template <class type> class queue;template<class type>class queue{public: template<class T> friend ostream &operator<<(ostream &os,const queue<T> &q); queue():head(0),tail(0) {} queue(const queue& q):head(0),tail(0) {} queue& operator=(const queue&); ~queue() { destroy(); } type& front() { return head->item; } const type& front() const { return head->item; } void push(const type&); void pop(); bool empty() const { return 0==head; }public: queueitem<type>* head; queueitem<type>* tail; void destroy(); void copy_elem(const queue&);};template <class type> class queueitem{public: friend class queue<type>; /*friend ostream &operator<<(ostream &os,queueitem<type> &q);*/ queueitem(const type& t):item(t),next(0) {} type item; queueitem* next;};template <class type>ostream& operator<< (ostream &os,const queue<type> &q){ os<<"<"; queueitem<type> *p=q.head; for(; p; p=p->next) os<<p->item<<" "; os<<">"; return os;}template<class type> void queue<type>::destroy(){ while(!empty()) pop();}template<class type> void queue<type>::pop(){ queueitem<type>* p=head; head=head->next; delete p;}template<class type> void queue<type>::push(const type &val){ queueitem<type>* pt=new queueitem<type>(val); if(empty()) head=tail=pt; else { tail->next=pt; tail=pt; }}template<class type>void queue<type>::copy_elem(const queue &orig){ for(queueitem<type>* pt=orig.head; pt; pt=pt->next) push(pt->item);}template<class type>queue<type>& queue<type>::operator =(const queue& now){ for(queueitem<type>* pt=now.head; pt; pt=pt->next) this->push(pt->item); return *this;}int main(){ queue<int> a; a.push(1); a.push(2); queue<int>b; b=a; cout<<a; return 0;}
[解决办法]
template<class S> friend ostream &operator<< (ostream &os,queue<S> &q);主要是 这里的第二个参数少了const。