c++模板问题

喝牛奶 2012-10-22 11:29:11
#include<iostream>

using namespace std;

template<typename T>
class Queue;

template<typename T>
ostream &operator<<(ostream &,const Queue<T>&);

template<typename T>
class QueueItem
{
friend ostream &operator<<(ostream &,const Queue<T>&);
friend class Queue<T>;
QueueItem(const T &t):item(t),next(0){}
QueueItem *next;
T item;
};

template<typename T>
class Queue
{
friend ostream &operator<<(ostream &,const Queue<T>&);
public:
Queue(const Queue &);
Queue():head(0),tail(0){}
~Queue();
void push(T const &);
bool empty();
void pop();
const T &front()const;
T &front();
Queue &operator=(const Queue &);
private:
QueueItem<T> *head;
QueueItem<T> *tail;
};

template<typename T>
Queue<T>::Queue(const Queue &Q):head(0),tail(0)
{
for(QueueItem<T> *ptr=Q.head;ptr;ptr=ptr->next)
push(ptr->item);
}

template<typename T>
Queue<T>::~Queue()
{
while(!empty())
pop();
}

template<typename T>
void Queue<T>::push(T const &t)
{
QueueItem<T> *pt=new QueueItem<T>(t);
if(empty())
head=tail=pt;
else
{
tail->next=pt;
tail=pt;
}
}

template<typename T>
bool Queue<T>::empty()
{
if(head==tail)
return true;
return false;
}

template<typename T>
void Queue<T>::pop()
{
QueueItem<T> *ptr=head;
head=head->next;
delete ptr;
}

template<typename T>
T const &Queue<T>::front()const
{return head->item;}

template<typename T>
T &Queue<T>::front()
{return head->item;}

template<typename T>
Queue<T> &Queue<T>::operator=(const Queue & QU)
{
while(!empty())
pop();
for(QueueItem<T> *ptr=QU.head;ptr;ptr=ptr->next)
push(ptr->item);
return *this;
}

template<>
class Queue<char const *>
{
public:
bool empty(){return real_queue.empty(); }
void pop(){real_queue.pop();}
string &front(){return real_queue.front();}
string const &front()const{return real_queue.front();}
void push(char const *);
private:
Queue<string> real_queue;
};
void Queue<char const *>::push(const char *ch)
{
real_queue.push(ch);
}

template<typename T>
ostream &operator<<(ostream &os,const Queue<T> &Q)
{
os<<"<";
for(QueueItem<T> *q=Q.head;q;q=q->next)
os<<q->item<<" ";
os<<">";
return os;
}

int main(void)
{
Queue<int> queue1;
queue1.push(2);
queue1.push(23);
cout<<queue1;
return 0;
}
...全文
169 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
NexTor 2012-10-24
你看一下这个链接里的解答吧,他这个和你的差不多,我也是刚学习的
http://topic.csdn.net/u/20110416/12/d6f490c6-7ddb-42ea-ba9e-7c2d20c050e8.html?29381
  • 打赏
  • 举报
回复
NexTor 2012-10-24

#include "stdafx.h"
#include <iostream>

using namespace std;

template<typename T>
class Queue;

template<typename T>
ostream &operator<<(ostream &,const Queue<T>&);

template<typename T>
class QueueItem;

template<typename T>
ostream &operator<<(ostream& os, const QueueItem<T>& item)
{
os<<"<";
os<<item.item;
os<<">";
return os;
}

template<typename T>
class QueueItem
{
public:
friend ostream &operator<< <T>(ostream &,const QueueItem<T>&);
friend class Queue<T>;
QueueItem(const T &t):item(t),next(0){}
QueueItem *next;
T item;
};

template<typename T>
class Queue
{
friend ostream &operator<< <T>(ostream &,const Queue<T>&);
public:
Queue(const Queue &);
Queue():head(0),tail(0){}
~Queue();
void push(T const &);
bool empty();
void pop();
const T &front()const;
T &front();
Queue &operator=(const Queue &);
private:
QueueItem<T> *head;
QueueItem<T> *tail;
};

template<typename T>
Queue<T>::Queue(const Queue &Q):head(0),tail(0)
{
for(QueueItem<T> *ptr=Q.head;ptr;ptr=ptr->next)
push(ptr->item);
}

template<typename T>
Queue<T>::~Queue()
{
while(!empty())
pop();
}

template<typename T>
void Queue<T>::push(T const &t)
{
QueueItem<T> *pt=new QueueItem<T>(t);
if(empty())
head=tail=pt;
else
{
tail->next=pt;
tail=pt;
}
}

template<typename T>
bool Queue<T>::empty()
{
if(head==tail)
return true;
return false;
}

template<typename T>
void Queue<T>::pop()
{
QueueItem<T> *ptr=head;
head=head->next;
delete ptr;
}

template<typename T>
T const &Queue<T>::front()const
{return head->item;}

template<typename T>
T &Queue<T>::front()
{return head->item;}

template<typename T>
Queue<T> &Queue<T>::operator=(const Queue & QU)
{
while(!empty())
pop();
for(QueueItem<T> *ptr=QU.head;ptr;ptr=ptr->next)
push(ptr->item);
return *this;
}

template<>
class Queue<char const *>
{
public:
bool empty(){return real_queue.empty(); }
void pop(){real_queue.pop();}
string &front(){return real_queue.front();}
string const &front()const{return real_queue.front();}
void push(char const *);
private:
Queue<string> real_queue;
};
void Queue<char const *>::push(const char *ch)
{
real_queue.push(ch);
}

template<typename T>
ostream &operator<<(ostream &os,const Queue<T> &Q)
{
os<<"<";
for(QueueItem<T> *q=Q.head;q;q=q->next)
os<<q->item<<" ";
os<<">";
return os;
}

int main(void)
{
Queue<int> queue1;
queue1.push(2);
queue1.push(23);
cout<<queue1;
return 0;
}
  • 打赏
  • 举报
回复
喝牛奶 2012-10-24
编译时有错误
  • 打赏
  • 举报
回复
fuqu2518 2012-10-24
在这有同样的解决方式http://msdn.microsoft.com/en-us/library/799kze2z(v=VS.80).aspx
其中:
You can also get LNK2019 if you are building a console application with /SUBSYSTEM:WINDOWS. The unresolved symbol will be _WinMain@16. In this case, just link with /SUBSYSTEM:CONSOLE.
所以修改工程,运行环境也许也行。
  • 打赏
  • 举报
回复
fuqu2518 2012-10-24
fedora 下 无#incldue "stdafx.h" 无问题 输出结果<23 >

如果是出现link问题建议google下应当能解决。
  • 打赏
  • 举报
回复
笨蛋糕 2012-10-23
lz怎么看?
  • 打赏
  • 举报
回复
好长...
  • 打赏
  • 举报
回复
Kaile 2012-10-23
你要说清楚,你想做什么,代码出现什么错误,运行时还是编译时,不然别人怎么看
  • 打赏
  • 举报
回复
喝牛奶 2012-10-23
代码有错误,请指正
  • 打赏
  • 举报
回复
十八道胡同 2012-10-23
问题是?
  • 打赏
  • 举报
回复
csd1208 2012-10-22
你发这么长的一段代码 是想做什么啊?
  • 打赏
  • 举报
回复
发帖
C++ 语言

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2012-10-22 11:29
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下