帮别人回答问题发现自己原来也不懂`````向高手求助(关于友员模板的问题)
#include <iostream>
using namespace std;
template <class Type> class QueueItem;
template <class Type> class Queue;
template <class Type> ostream& operator<< ( ostream &, const Queue<Type>& );
template <class Type> ostream& operator<< ( ostream &, const QueueItem<Type>& );
template <class Type>
class QueueItem
{
friend class Queue<Type>;
friend ostream& operator<< ( ostream &, const QueueItem<Type>& ); //友元声明
public:
QueueItem( const Type& t ) : item(t) {next = 0;}
~QueueItem(){};
QueueItem *next;
private:
Type item;
};
template <class Type>
class Queue
{
friend ostream& operator<< ( ostream &, const Queue<Type>& );
public:
Queue() : front( 0 ), back( 0 ) { }
~Queue(){};
//友元声明
private:
QueueItem<Type> *front;
QueueItem<Type> *back;
};
// 只给出重载函数的定义, 其它函数的定义给略了
template <class Type> ostream& operator<< ( 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> ostream& operator<< ( ostream &os, const QueueItem<Type>&qi )
{
os << qi.getItem();
return os;
}
int main()
{
QueueItem<int> iqi(3);
cout << iqi;
Queue<int> iq;
system("pause");
}
现在有三个警告如下:
16 C:\Dev-Cpp\C++-Test\main.cpp [Warning] friend declaration `std::ostream& operator<<(std::ostream&, const QueueItem<Type>&)' declares a non-template function
16 C:\Dev-Cpp\C++-Test\main.cpp [Warning] (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
29 C:\Dev-Cpp\C++-Test\main.cpp [Warning] friend declaration `std::ostream& operator<<(std::ostream&, const Queue<Type>&)' declares a non-template function
一个错误:
[Linker error] undefined reference to `operator<<(std::ostream&, QueueItem<int> const&)'
警告是说:友员函数不是模板函数吗?