3 回答

TA貢獻1772條經驗 獲得超6個贊
class A{
public:
friend void fun(A a){std::cout << "Im here" << std::endl;}
friend void fun2(){ std::cout << "Im here2" << std::endl; }
friend void fun3();
};
雖然你的定義fun2 確實定義了一個“全球性”的功能,而不是一個成員,并使它成為friend的A同時,仍然丟失了一些在全球范圍內本身相同功能的聲明。
這意味著該范圍內的任何代碼都不fun2存在任何想法。
發(fā)生相同的問題fun,因為依賴于參數(shù)的查找可以接管并找到該函數(shù),因為存在類型為的參數(shù)A。
我建議改為以通常的方式定義函數(shù):
class A {
friend void fun(A a);
friend void fun2();
friend void fun3();
};
void fun(A a) { std::cout << "I'm here" << std::endl; }
void fun2() { std::cout << "I'm here2" << std::endl; }
void fun3();
現(xiàn)在注意,一切正常(除了fun3因為我從未定義過)。

TA貢獻1155條經驗 獲得超0個贊
您可以調用的原因fun是,類內的friend聲明A僅通過依賴于參數(shù)的查找使其可見。否則,朋友聲明不會使它們聲明的函數(shù)在出現(xiàn)的類范圍之外自動可見。
您需要在名稱空間范圍內或內部添加聲明,main以使其fun2在中可見main。
例如
void fun2();
fun3在內部可見,main因為其定義(在類外部)也是一個聲明,使它可以從看到main。
ISO / IEC 14882:2011 7.3.1.2:
直到通過在名稱空間范圍中提供匹配的聲明(在授予友誼的類定義之前或之后),才可以通過非限定查找(3.4.1)或限定查找(3.4.3)找不到朋友的名稱。
3.4.2(依賴于參數(shù)的名稱查找)/ 4:
在關聯(lián)類中聲明的任何命名空間范圍的好友函數(shù)或好友函數(shù)模板在其各自的命名空間中都是可見的,即使它們在普通查找(11.3)中不可見。
- 3 回答
- 0 關注
- 425 瀏覽
添加回答
舉報