2010-09-03 93 views
6

$ 11.4/5 - 「[...]在一個類中定義的朋友的功能是在類的(詞法)範圍,其中它被定義[...]」好友混亂

這是什麼聲明的意思?

struct A{ 
    typedef int MYINT; 
    void f2(){f();}     // Error, 'f' is undefined 
    friend void f(){MYINT mi = 0;}  // Why does this work, shouldn' it be A::MYINT? 
    void f1(){f();}     // Error, 'f' is undefined 
}; 

int main(){} 
  1. 這到底是怎麼迷惑的是,呼籲從 'A :: F1' 'F' 是安靜的理解。然而,當朋友處於友誼班的「詞彙」範圍時,爲什麼從'A :: f2'調用'f'是不合格的? 「詞法」範圍意味着什麼?

  2. 在同一類型中爲什麼在'f'中'MYINT'的用法正常?它不應該是'A :: MYINT'嗎?

如果我添加型 'A *' 到 'F' 的參數,那麼這兩個 'F1' 和 'F2' 都能夠找到,因爲ADL的 'F'。這是可以理解的。

+2

在(詞彙)範圍內意味着它有權訪問包含範圍。因此MYINT是有效的。 http://stackoverflow.com/questions/1047454/what-is-lexical-scope,http://stackoverflow.com/questions/991518/c-how-do-i-call-a-friend-template-function-定義-內部-A級 – Anycorn 2010-09-03 03:22:25

回答

1

您僅顯示§ 11.4/5的一部分內容。據它f()應該首先在類外聲明(函數應該有命名空間範圍)。試試這個:

void f(); // declare it first 
struct A{ 
    typedef int MYINT; 
    void f2(){f();}      
    friend void f(){MYINT mi = 0;}  // definition of global f, a friend of A 
    void f1(){f();}      
}; 

至於第二個問題,這是可以的,因爲通過的§ 11.4/5你的一部分引用。 f()服從與該類的靜態成員函數相同的名稱綁定規則,並且對封閉類的成員沒有特殊訪問權限。

0

這裏是我的我的查詢的一個部件,它是

的interpreation「爲什麼MYINT」可以被稱爲 「MYINT」代替「A :: MYINT」?

$ 3.4.1/9條規定 - 「名稱查找在一個 友元函數(11.4)的定義中使用一個 名在類授予友誼定義內嵌 應 在 成員函數定義爲查找說明操作如果 友元函數不是在 類授予友誼定義,名稱查找 在友元函數定義 作爲查找 命名空間中的成員函數的定義 描述着手「。

在我們的例子中,要查找的名稱是'MYINT',它是一個非限定名稱。在該類中內聯定義的朋友'f'的定義內查找該名稱將與'A'的成員函數完全相同。

我的理解是否正確?