以下示例格式正确吗?
namespace N {
class A;
}
using namespace N;
class B {
int i;
friend class A;
};
namespace N {
class A {
B m;
int get() { return m.i; }
};
}
此示例使用 Clang 3.5 成功编译,但使用 g++ 4.8.1 编译失败,原因如下:
main.cpp: In member function ‘int N::A::get()’:
main.cpp:7:9: error: ‘int B::i’ is private
int i;
^
main.cpp:14:30: error: within this context
int get() { return m.i; }
^
C++11 标准§7.3.1.2 p3 说,
如果
friend
声明中的名称既不是限定词也不是模板标识,并且声明是函数或详细类型说明符,则确定实体是否先前已声明的查找不应考虑最内层封闭命名空间之外的任何范围。
例如,class A
不是最内层封闭命名空间(即全局命名空间)的成员,而是class A
通过 using 指令引入到全局命名空间中。