2016-07-05 32 views
2

工作,我需要創建一個動態庫:朋友定義不與gcc4.9

mylib.h

class FriendClass; 

namespace my_namespace 
{ 

class MyLib 
{ 
    friend class FriendClass; 

public: 
    MyLib(); 

    /* public functions */ 

private: 
    void function_for_friend_class(); 
}; 

} // namespace my_namespace 

在這裏使用它

friend_function.h

class FriendClass 
{ 
public: 
    void some_function() 
    { 
     MyLib* my_lib = get_my_lib_somehow(); 
     my_lib->function_for_friend_class(); 
    } 
}; 

With它編譯的gcc3.4,但gcc4.9抱怨函數function_for_friend_class是私有的。我究竟做錯了什麼?

+2

嘗試是'友元類:: FriendClass;'。或'friend FriendClass;' –

+0

但是它不是在全局命名空間中查找,當它不會在當前命名空間中找到? – user1289

+0

是的,它工作.. – user1289

回答

0

使用friend class ::FriendClass; 通過這樣做,您告訴編譯器查找class FriendClass定義的全局名稱空間,而不是在當前名稱空間中查找。

還可以使用:

my_namespace::MyLib* my_lib = get_my_lib_somehow(); 
+0

問題的關鍵在於爲什麼全局範圍無法找到? – songyuanyao

+0

因爲通過編寫「friend類FriendClass」,您告訴編譯器只查看當前名稱空間,而不查找全局名稱空間。 –

+0

[非限定名稱查找](http://en.cppreference.com/w/cpp/language/unqualified_lookup#Namespace_scope)應找到名稱,如果您沒有明確指定範圍。問題是爲什麼它不能在這裏工作。 – songyuanyao