类模板友元函数的声明

模板类实现时与普通类实现时的差别

1、类模板不支持分离编译,即类的声明与实现应写在同一个文件中(实践所得,调试很久才发现这个错误);

2、模板友元函数声明方法:(自己实现图数据结构时的一段代码)

//定点类的声明; 
template<typename T>class Vertex;
// 友元函数的声明,友元的声明仅指明访问权限,并非通常意义的函数声明。为对类的使用者可见,每个函数需要单独声明。 
template<typename T>
bool operator==(const Vertex<T>&,const Vertex<T>&);
template<typename Tv>
istream& operator >>(istream&input, Vertex<Tv>&a);
template<typename Tv>
ostream& operator<<(ostream&output,const Vertex<Tv>&a);

typedef enum {undiscovered,discovered,unvisited,visited} s;

//定义顶点类vertex;
template<typename Tv>class Vertex 
{
    public:
Vertex():data(0),status(undiscovered){}
Tv getData()
    {
    return data;
}
void setData(Tv data_)
    {
    data=data_; 
}
void diff(const Vertex<int>&a)
    {
    cout<<a.data;
    cout<<*this; 
}
private:
Tv data;
s status;

//友元的声明 
friend bool operator==<Tv> (const Vertex<Tv>&a, const Vertex<Tv>&b);
friend istream& operator >> <Tv>(istream&input, Vertex<Tv>&a);
friend ostream& operator << <Tv>(ostream&output,const Vertex<Tv>&a);
};

//友元函数的实现;
template<typename Tv>
bool operator==(const Vertex<Tv>&a, const Vertex<Tv>&b) {
return a.data == b.data;
}

template<typename Tv>
istream& operator >>(istream&input, Vertex<Tv>&a) {
input >>a.data;
return input;
}

template<typename Tv>
ostream& operator<<(ostream&output,const Vertex<Tv>&a) {
output << a.data;
return output;
}
如有不当,欢迎指正 :)
原文地址:https://www.cnblogs.com/lif323/p/6984807.html