2016-07-05 34 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