先看一个例子:
按照BS在《C++程序设计语言》(11.5节)的说法,一个友元不应给其外围作用域内引入一个名字。
然而,在"C++ Primer"(第4版, 12.5节)的说法,一个友元会在其外围名字空间域内声明了一个名字。
上面那个例子, VC++ 2005和MingW(gcc 3.4.2)都可以编译通过,且运行正常。
不过据说最新的4.x系列gcc,上面那个代码就编不过了。
-
file1.cpp
namespace ns1
{
class Test
{
friend void func();
};
}
int main()
{
ns1::func();
}
- file2.cpp
#include <cstdio>
using namespace std;
namespace ns1
{
void func()
{
printf("func in %s ", __FILE__);
}
}
namespace ns1
{
class Test
{
friend void func();
};
}
int main()
{
ns1::func();
}
- file2.cpp
#include <cstdio>
using namespace std;
namespace ns1
{
void func()
{
printf("func in %s ", __FILE__);
}
}
按照BS在《C++程序设计语言》(11.5节)的说法,一个友元不应给其外围作用域内引入一个名字。
然而,在"C++ Primer"(第4版, 12.5节)的说法,一个友元会在其外围名字空间域内声明了一个名字。
上面那个例子, VC++ 2005和MingW(gcc 3.4.2)都可以编译通过,且运行正常。
不过据说最新的4.x系列gcc,上面那个代码就编不过了。