C++ 的一个友员错误 联想

  C++的友员,应该都是知道一点,但就是很能深入。
今天我在DevC++上发现各问题。
程序如下
#include <iostream>
namespace C
{
class D{};
void f()
 {
    std::cout<<"Hello";
 }
}
namespace B
{
using C::f;  //使用using 声明时出错,用using namespace C;就不会??
class A
{
 friend void f();
};
}

int main()
{
    C::f();
    system("pause");
}

当我用using C::f;时程序出错,提示为:
15 D:/Coder/Dev-Cpp/Project/Test1/main.cpp `void B::f()' conflicts with previous using declaration `void C::f()'
说 B::f()和 C::f()冲突。。。

按我的想法是, 在class A中的friend void f();声明,可以是 namespace B中的 void f()的第一次声明。这个声明的效果就相当于在class A的前面有个 void f()声明一样。
这样一来,using C::f;带来了二次声明的冲突。
当使用 using namespace C;时因为  C::f被引入到 f查找的全局名字空间中了,所以namespace  B中的 class A前面那个隐式的 void f();声明屏蔽掉了外面的。
这里隐含的错误没有被触发,所以程序运行正确(B::f()其实不存在) 。

从这个例子中,我个人总结为:
 friend声明是个 自由声明(非受限声明)时,其实是在class的前面插个声明,也就是说
friend的自由声明 引用 是 class所在名字空间的 成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值