为什么我无法从不同命名空间中的友元类更改类的私有成员?
Why can't I change a private member of a class from a friend class in a different namespace?
我发现从朋友类访问类的私人成员时遇到问题。
保存我要更改的私有成员的类和进行更改的类位于不同的命名空间中。
友元类是在保存数据的类之后定义的,因此我尝试在命名空间之外转发声明友元类。
g++说我不能修改成员,因为它是私有的,Visual Studio似乎认为它很好。
我在这里做一些奇怪的非标准的事情吗?为什么我不能更改会员?这是一个简化的代码片段,代表我的问题:
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();
}
friend struct ::S;
你真正在做什么
friend struct S;
将类 N::S 声明为友元(无处定义)。
编辑:为了支持我的想法,即 gcc 行为是正确的,VC++ 有一个错误。
7.3.1.2/3
如果非本地类中的
friend
声明首先声明一个类或 函数 友元类或函数是最内层的成员 封闭命名空间。[...] 当寻找事先声明 由 friend 声明引入的类或函数,作用域在 不考虑最里面的封闭命名空间范围。
因为friend struct S;
声明N::S
类,但你需要::S
类。
试着写出friend struct ::S;
.
目前,假设不存在N::S
。此修复指定全局命名空间,有点类似于 Linux 路径上的前导/
指定文件系统根目录的方式。
相关文章:
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 如何启用友元类的友元功能直接在C++中访问其私有成员
- C++:成员不可访问-使用友元函数允许一个类修改另一个类的成员数据
- 如何将一个类的成员函数用作另一类的友元函数
- 友元函数无法访问私有类成员
- 友元类声明和成员函数声明
- 友元类对象是否可以在其成员函数中访问派生类对象的基类私有成员?
- C++重载友元函数无法访问私有成员
- 友元函数将内存分配给数组成员是否有任何限制?
- 成员函数与友元函数:为什么是一个而不是另一个?
- 类具有友元函数.该函数在不同的头文件中的同名 apce 中定义.它无法访问私有成员
- 在子类函数中访问超类友元的受保护数据成员
- 成员函数在C++中用作友元函数
- C++中的友元成员函数 - 转发声明不起作用
- 友元函数看不到私有成员变量
- 类模板中的友元成员函数定义
- 友元成员函数无法访问private成员
- 互惠友元成员函数=循环包含声明