函数模版与访问权限

bigtankbigtank 2009-08-17 11:42:00
//============================================================================================================
//函数模版与访问权限的关系

template<typename T> void Outer(T t){
t();
}

class CNestedAccessed{
public:
void call(void){
callOuter();
}
private:
void callOuter(void);
struct CNested{
void operator()(void){
}
};
};

void CNestedAccessed::callOuter(void){
//尽管CNested是CNestedAccessed的私有成员,但Outer<T>(T)仍可访问CNested的公有成员
Outer(CNested());
}

int main(int,char*){
CNestedAccessed NestedAccessed;
NestedAccessed.call();

return 0;
}

我在VC++8下编译通过。
请大家尽量在不同的C++编译器下编译,如果都能通过那就说明函数模版与普通函数的访问权限规则还是有所不同的。
...全文
59 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly___fly 2009-08-17
  • 打赏
  • 举报
回复
我个人感觉,对CNested的访问权限是由Outer(CNested())这句决定的。
这句相当于Outer<CNested>(CNested()), 这个地方是可以访问CNested的,所以函数里使用的也是传入模板类的权限,而不能看作是简单的函数调用。

类CNested是作为模板参数传入的,同时传入的应该还包括权限。

本人水平也不高,这仅为个人理解。
taodm 2009-08-17
  • 打赏
  • 举报
回复
wxdevcpp体积很小,自己装一个试试就知道了。
Dave888Zhou 2009-08-17
  • 打赏
  • 举报
回复
你这个例子根本就不能说明“函数模版与普通函数的访问权限规则不同“。实际上在访问权限上他们并没有什么不同,函数模板可以理解为一些函数的集合呀,实例化后不也是一个具体的函数吗?

显然,你用Outer(CNested())语句,是想看看Outer(T)能不能调用CNestedAccessed的私有成员,这里当然可以调用喽。 你在成员函数CNestedAccessed::callOuter()的实现中使用这个语句,他当然能看到CNestedAccessed类的私有成员CNested了,类的成员函数实现中难道不能使用类的私有成员吗?

当转到Outer函数里时,它看到的就是一个CNested类的对象,与CNestedAccessed没有任何关系了,它也不需要知道CNestedAccessed类的任何信息。你把一个CNested类的对象传给它了,难道它还要去问CNested类是哪个类的成员呢?是私有成员还是公有成员呢?等等。(一个函数会有这样的能力吗?)

它直接根据t这个对象(通过复制构造函数从CNested()这个匿名对象复制而来)的访问权限来运行就可以了。因为CNested::opeator()是公有的,那t()调用当然没问题了。

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧