2012-01-18 130 views
0

這段代碼有什麼問題?封閉範圍

class matrix{ 
private: 
    friend transpose(const matrix&); 
    friend class invert; 
    public: //... 
}; 
matrix (*p)(const matrix&)=&transpose; //error: no transpose() in scope. 

這句話是什麼意思「的朋友聲明不引入名字進入封閉的範圍」。這不會發生問題時,朋友關鍵字已被移除

+2

首先,你的'轉置'缺少它的返回類型。 – Xeo 2012-01-18 16:05:59

回答

1

轉置()作爲朋友聲明而沒有朋友聲明的區別在於,如果您聲明「朋友轉置()」,您所做的只是告訴編譯器一個具有朋友聲明可以訪問矩陣類型的對象的私有成員。它確實用而不是用這個簽名聲明瞭一個函數transpose() - 你仍然必須在矩陣類的範圍之外這麼做。

如果您刪除'friend'關鍵字,那麼您在類矩陣內部聲明瞭一個成員函數transpose(),因此編譯器實際上已經看到了一個函數,它可以取地址。

1

§7.3.1.2 [namespace.memdef] p3

[.. 。]如果非本地類中的某個friend聲明首先聲明一個類或函數,則該友元類或函數是最內層的封閉名稱空間的成員。 通過非限定查找或合格查找找不到朋友的名字,直到在該名稱空間範圍中提供了匹配聲明(在授予友誼的類定義之前或之後)。 [...]

另請參閱this question of mine

+0

如果我們只聲明不在封閉範圍中定義好友功能,那麼它會起作用或不起作用?如果我們只是在封閉範圍內聲明而不聲明它會怎麼樣 – 2012-01-18 17:12:17

0
  1. 朋友函數是不是類的成員,但 他們仍然可以訪問類的私有成員函數。

  2. 我應該指出的是,一個朋友函數聲明 可放置在任何私人部分或者公衆部分,
    但它會在兩種情況下公開的功能,所以它是更清楚 列表它公共部分。

class MyClass 
{ 
private: 
    int data; 
public: 
    MyClass(int value); 
    friend void myFriend(MyClass *myObject); 

}; 

void myFriend(MyClass *myObject) 
{ 
    cout << myObject->data<< endl; 
} 

MyClass::MyClass(int value) 
{ 
    data = value*2; 
} 

int main() 
{   
    MyClass myObject(3); 
    myFriend(&myObject); 
} 

所以,你需要聲明後,定義友元函數。