gpt4 book ai didi

c++ - 为什么我不能从不同 namespace 中的友元类更改类的私有(private)成员?

转载 作者:可可西里 更新时间:2023-11-01 17:14:12 39 4
gpt4 key购买 nike

我发现从好友类访问类的私有(private)成员时遇到问题。

持有我要更改的私有(private)成员的类和进行更改的类在不同的命名空间中。

friend 类是在保存数据的类之后定义的,所以我尝试在命名空间外转发声明 friend 类。

g++说我不能修改成员,因为它是私有(private)的,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

If a friend declaration in a non-local class first declares a class or function the friend class or function is a member of the innermost enclosing namespace. [...] When looking for a prior declaration of a class or function introduced by a friend declaration, scopes outside the innermost enclosing namespace scope are not considered.

关于c++ - 为什么我不能从不同 namespace 中的友元类更改类的私有(private)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6003373/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com