首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

模板种、模板函数与重载

2013-08-25 
模板类、模板函数与重载#ifndef QUEUE_H#define QUEUE_H#include iostreamtemplate class T class Queu

模板类、模板函数与重载

#ifndef QUEUE_H
#define QUEUE_H

#include <iostream>

template <class T> class Queue;

template <class Type>
std::ostream &operator << (std::ostream &os,const Queue<Type> & q)
{
os << "< ";
QueueItem<Type> *p;
for(p=q.front;p;p=p->next)
os << *p << " ";
os<<">";
return os;
}


template <class Type>
std::ostream &operator <<(std::ostream &os,const QueueItem<Type> & qi)
{
os << qi.item;
return os;
}



template <class T>
class QueueItem
{

friend class Queue<T>;
friend std::ostream &operator << <T> (std::ostream &os,const QueueItem<T> & qi);
public:
QueueItem(const T &a):item(a),next(NULL){}
private:
T item;
QueueItem *next;
};

 template <class Type>
class Queue
{
friend std::ostream &operator << <Type>  (std::ostream &,const Queue<Type> & );
public:
Queue();
~Queue();

Type remove();
void add(const Type &);
bool is_empty() const
{
return front==0;
}
private:
QueueItem <Type> *front;
QueueItem <Type> *back;
};




//实现部分

//using namespace std;

template <class Type>
inline Queue<Type>::Queue()
{front=back=0;}

template <class Type>
Queue<Type>::~Queue()
{
while (!is_empty())
{
remove();
}
}
template <class T>
T Queue<T>::remove()
{
if (is_empty())
{
cerr << "remove() on empty queue\n";
exit(-1);
}

QueueItem<T> *pt=front;
front=front->next;

T retval=pt->item;
delete pt;
return retval;
}

template <class T>
void Queue<T>::add(const T &val)
{
QueueItem<T> *pt=new QueueItem<T>(val);

if (is_empty())
{
front=back=pt;
}
else
{
back->next=pt;
back=pt;
}
}


#endif



上面这段代码编译的时候提示错误:
1>c:\users\administrator\documents\visual studio 2012\projects\smart pointer\queue\queue.h(21): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\users\administrator\documents\visual studio 2012\projects\smart pointer\queue\queue.h(21): error C2143: 语法错误 : 缺少“,”(在“<”的前面)

不知道是什么原因,望高手解惑 C++ 类
[解决办法]
在g++中编译了一下,除了要加上template <class T> class QueueItem;外,没有其它大的错误,楼主是不是用了VC6?是的话请改用其它编译器。

热点排行