友元类声明和 using 指令
-
21-12-2019 - |
题
下面的例子格式正确吗?
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
声明既不合格也不合格 模板 ID 并且声明是一个函数或一个 详细类型说明符, ,确定实体是否先前已声明的查找不应考虑最内层封闭命名空间之外的任何范围。
例如, class A
不是以下成员 最内层封闭命名空间 (IE。全局命名空间),但是 class A
通过 using 指令引入全局命名空间。
解决方案
虽然使用命名空间 N 将名称 N::A 拉入全局命名空间,但它并未在全局命名空间中声明 A。因此,全局命名空间中的另一个 A 是 B 的友元。铿锵是错误的。
其他提示
使 N::A
无资格a friend
的 B
你会用
friend A;
而不是
friend class A;
当使用详细的类型说明符时,即 class A
, ,并且正是在这种特定的形式中,它引入了一个类名(参见 3.4.4 [basic.lookup.elab] 第 2 段)。
不隶属于 StackOverflow