我发现从朋友类访问 class 的私人成员时遇到问题 .
包含我想要更改的私有成员的类以及进行更改的类位于不同的名称空间中 .
友元类是在持有数据的类之后定义的,所以我试图在名称空间之外转发声明友元类 .
g说我无法修改会员,因为它是私人的,视觉工作室似乎认为这很好 .
我在这里做一些奇怪的非标准事吗?为什么我不能改变会员?这是一个代表我的问题的简化代码段:
struct S;
namespace N
{
class A
{
int m;
public:
A():m(5){};
friend struct S;
};
}
using namespace N;
struct S
{
A& a;
S(A& a):a(a) {}
void changeA(){ a.m = 9; }
};
int main()
{
A a;
S s(a);
s.changeA();
}
3 回答
你真正在做什么
正在宣布N :: S类(无处可定义)的朋友 .
编辑:支持我的想法,gcc行为是正确的,VC有一个错误 .
7.3.1.2/3
因为
friend struct S;
声明了N::S
类但你需要::S
类 .尝试写出
friend struct ::S;
.目前,假设不存在
N::S
. 此修复程序指定全局命名空间,有点像Linux路径上的前导/
指定文件系统根目录 .