我重载了输出运算符用来输出Queue模板类,但是提示无法解析的外部符号。编译器:vs2013
以下是class的定义和成员的实现:
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include <deque>
#include <iostream>
using namespace std;
template <typename elemtype>
class Queue{
friend ostream& operator<<(ostream& os, const Queue<elemtype>& que);
public:
Queue(){}
Queue(const Queue& que);
void insert(const elemtype& elem);
void remove(elemtype& elem);
bool empty()const;
Queue& operator=(const Queue& que);
int size()const;
elemtype* find(const elemtype& elem);
private:
deque<elemtype> _que;
ostream& print(ostream& os = cout)const;
};
//输出运算符
template <typename elemtype>
ostream& operator<<(ostream& os, const Queue<elemtype>& que)
{
return que.print(os);
}
//拷贝构造函数
template <typename elemtype>
Queue<elemtype>::
Queue(const Queue& que)
{
*this = que;
}
//插入函数
template <typename elemtype>
void Queue<elemtype>::
insert(const elemtype& elem)
{
_que.push_front(elem);
}
//移除函数
template <typename elemtype>
void Queue<elemtype>::
remove(elemtype& elem)
{
if (empty())
{
return;
}
else
{
elem = _que.back();
_que.pop_back();
}
}
//是否空
template <typename elemtype>
bool Queue<elemtype>::
empty()const
{
return _que.empty();
}
//打印
template <typename elemtype>
ostream& Queue<elemtype>::
print(ostream& os)const
{
for (int i = 0; i < size(); i++)
{
os << _que[i] << ' ';
}
return os;
}
//赋值操作符
template <typename elemtype>
Queue<elemtype>& Queue<elemtype>::
operator=(const Queue& que)
{
_que = que._que;
return *this;
}
//元素个数
template <typename elemtype>
int Queue<elemtype>::
size()const
{
return _que.size();
}
//查找元素
template <typename elemtype>
elemtype* Queue<elemtype>::
find(const elemtype& elem)
{
for (int i = 0; i < size(); i++)
{
if (_que[i] == elem)
{
return &(_que[i]);
}
}
return 0;
}
#endif
以下是测试代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include "queue.h"
int main()
{
Queue<string> que;
que.insert("!!!!");
que.insert("world");
que.insert("hello");
que.insert("menglin:");
cout << que << endl;
return 0;
}
friend ostream& operator<<(ostream& os, const Queue<elemtype>& que);
这不是一个模板。这是一个普通函数,而它的一个参数是模板类。而这个是一个模板。所以他们不可能是同一个函数。 friend 函数有定义,而没有实现。
前面一段可以改成这样:
这样 friend 声明里的函数就是一个模板函数了。