关于C++函数模板的友元函数的一个小问题。

我在classset里面把bing函数设为了友元template<classType>classset{public:set(Typek){lis.clear();lis... 我在class set里面把bing函数设为了友元
template<class Type>
class set
{
public:
set(Type k) { lis.clear(); lis.push_back(k); }
set() { lis.clear(); }
friend set<Type> bing(set<Type> set1, set<Type> set2);
private:
list<Type> lis;
};
并函数的定义为:
template<class Type>
set<Type> bing(set<Type> set1, set<Type> set2)
{
。。。。。
}
然后我在main函数里面调用bing函数
set<int> k1(1), k2(2), k3(3);
k1 = bing<int>(k1, k2);
却告诉我无法访问private成员,但我设了友元了啊?
之后我把友元声明改为:
template<class TT> friend set<TT> bing(set<TT> set1, set<TT> set2);
就对了,这是为什么呢?
展开
 我来答
yyrryyrr2
推荐于2016-04-27 · TA获得超过1120个赞
知道小有建树答主
回答量:296
采纳率:0%
帮助的人:450万
展开全部
类模板中可以使用三种友元声明:
(1)普通非模板类或函数的友元声明。
(2)类模板或函数模板的友元声明,授予对所有实例类或函数的访问权。例如:
template <class T> class demo {
template <class T> friend class test;
template <class T> friend void fun();
...
};

(3)只授予某个模板的特定实例以访问权。例如:
template <class T> class test;
template <class T> class demo {
friend class test<T>; //只有test类模板的T实例才可访问demo类私有成员
friend void fun<T>();
...
};

你代码的问题出在:
friend set<Type> bing(set<Type> set1, set<Type> set2);
这一句,friend关键字前没有template,故编译器不认为这是第(2)种情况;bing函数名后面又没有<Type>,故不是第三种情况。
换句话说,编译器把这句话当作了第(1)种解释。
作如下实验可以验证这一点:

template<class Type>
set<Type> bing(set<Type> set1, set<Type> set2)
{
。。。。。
}
改为:
set<int> bing(set<int> set1, set<int> set2)
{
。。。。。
}
发现编译可以通过,说明编译器确实把你的友元声明当作了一个普通函数声明,而不是类模板的实例声明。

最方便的使代码正确的方法是:

friend set<Type> bing(set<Type> set1, set<Type> set2);
改为
friend set<Type> bing<Type>(set<Type> set1, set<Type> set2);
使编译器选择第三种解释。
并且,必须在set类模板声明前加上:
template<class Type>
set<Type> bing(set<Type> set1, set<Type> set2);
因为必须让编译器知道 bing是个类模板
doll_go
2010-12-19 · TA获得超过150个赞
知道小有建树答主
回答量:85
采纳率:0%
帮助的人:122万
展开全部
明显这说明,你在类内部的申明和实现的不是同一个函数:
首先呢,set内部的申明的友元函数的返回值类型和参数类型是由set的模板数据类型确定的,而你定义的模板函数的返回值类型和参数类型是由函数的模板数据类型确定的;
重新改了以后这样子申明的友元和实现的才是同一个函数!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式