友元模板函数的问题
定义print函数是QueneItem模板类的友元,可是编译的时候提示我QueneItem的data和next是私有成员,不能访问!!!难道友元函数写错了吗,可是print同样是Quene模板类的友元啊,print可以访问Quene的私有成员head啊!!! 谁能给我解释解释!
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
using std::ostream;
using std::cout;
template <class Type> class Quene;
template <class Type> class QueneItem;
template <class Type> void print (Quene<Type> Q);
template <class Type> class QueneItem
{
friend class Quene<Type>;
template <class Type> friend void print ( Quene<Type> Q);
public:
QueneItem( Type t1):data(t1),next(0){}
private:
Type data;
QueneItem<Type> *next;
};
template <class Type> class Quene
{
template <class Type> friend void print ( Quene<Type> Q);
public:
Quene():head(0),end(0){}
void pushback(Type t);
void show();
private:
QueneItem<Type> *head;
QueneItem<Type> *end;
};
template <class Type> void Quene<Type>::pushback(Type aap)
{
QueneItem<Type> *pt=new QueneItem<Type>(aap);
if(head==0&&end==0)
head=end=pt;
else
{
end->next=pt;
end=pt;
}
}
template <class Type> void Quene<Type>::show()
{
QueneItem<Type> *p;
p=head;
while(p!=0)
{
std::cout<<p->data<<std::endl;
p=p->next;
}
}
template <class Type> void print(Quene<Type> Q)
{
cout << " < ";
QueneItem <Type> *p;
for ( p = Q.head; p; p = p->next )
cout << p->data << " ";
cout << " >";
}
int main()
{
Quene<int> hkb;
hkb.pushback(5);
hkb.pushback(3);
hkb.pushback(6);
hkb.show();
print(hkb);
return 0;
}
[解决办法]
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
using std::ostream;
using std::cout;
template <class Type> class Quene;
template <class Type> class QueneItem;
template <class Type> void print (Quene<Type> Q);
template <class Type>
class QueneItem
{
friend class Quene<Type>;
template <class Type1> friend void print ( Quene<Type1> Q);
public:
QueneItem( Type t1):data(t1),next(0){}
private:
Type data;
QueneItem<Type> *next;
};
template <class Type>
class Quene
{
template <class Type1> friend void print ( Quene<Type1> Q);
public:
Quene():head(0),end(0){}
void pushback(Type t);
void show();
private:
QueneItem<Type> *head;
QueneItem<Type> *end;
};
template <class Type> void Quene<Type>::pushback(Type aap)
{
QueneItem<Type> *pt=new QueneItem<Type>(aap);
if(head==0&&end==0)
head=end=pt;
else
{
end->next=pt;
end=pt;
}
}
template <class Type> void Quene<Type>::show()
{
QueneItem<Type> *p;
p=head;
while(p!=0)
{
std::cout<<p->data<<std::endl;
p=p->next;
}
}
template <class Type> void print(Quene<Type> Q)
{
cout << " < ";
QueneItem <Type> *p;
for ( p = Q.head; p; p = p->next )
cout << p->data << " ";
cout << " >";
}
int main()
{
Quene<int> hkb;
hkb.pushback(5);
hkb.pushback(3);
hkb.pushback(6);
hkb.show();
print(hkb);
return 0;
}
除了type重名了,改成type1了,没变化,其实是可以友元特化的
[解决办法]
楼上说得没错,我编译你的代码的报错原因是下面中友元函数的类型参数名和类模板里面的重名了,你只要把友元函数模板的类型参数名改成其它的就行了
- C/C++ code
template <class Type> class Quene{ template <class Type> friend void print ( Quene<Type> Q);