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