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所在名字空间的 成员。

阅读更多
下一篇强大sizeof
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭