簡體   English   中英

為什么我不能從不同命名空間中的友元類更改類的私有成員?

[英]Why can't I change a private member of a class from a friend class in a different namespace?

我發現從朋友類訪問班級的私人成員時遇到問題。

包含我想要更改的私有成員的類以及進行更改的類位於不同的名稱空間中。

友元類是在持有數據的類之后定義的,所以我試圖在名稱空間之外轉發聲明友元類。

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();
}
friend struct ::S;

你真正在做什么

friend struct S;

正在宣布N :: S類(無處可定義)的朋友。

編輯:支持我的想法,gcc行為是正確的,VC ++有一個錯誤。

7.3.1.2/3

如果非本地類中的friend聲明首先聲明一個類或函數,那么友元類或函數是最內層封閉命名空間的成員。 [...]當查找由朋友聲明引入的類或函數的先前聲明時,不考慮最內部封閉命名空間作用域之外的作用域。

因為friend struct S; 聲明N::S類,但你需要::S類。

嘗試寫出friend struct ::S;

目前,假設不存在N::S 此修復程序指定全局命名空間,有點像Linux路徑上的前導/指定文件系統根目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM