读书人

模板有关问题重载 quot;lt;lt;amp;quot

发布时间: 2012-04-27 11:57:44 作者: rapoo

模板问题,重载 "<<"
#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 个无法解析的外部命令


求解答

[解决办法]

C/C++ code
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才通过了。


C/C++ code
#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。

读书人网 >C++

热点推荐