【发布时间】:2016-07-05 07:13:30
【问题描述】:
我需要创建一个动态库:
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();
}
};
使用 gcc3.4 可以编译,但 gcc4.9 抱怨 function_for_friend_class 是私有的。我做错了什么?
【问题讨论】:
-
试试
friend class ::FriendClass;。或friend FriendClass; -
但是它不是在寻找全局命名空间,当它在当前命名空间中找不到时?
-
friend class xxx尽可能声明一个新类,friend xxx查找现有类。 -
gcc34 - “声明朋友时必须使用类密钥”,只有
class ::FriendClass在两个版本中都有效。 -
@songyuanyao 好的,我想我找到了:*如果朋友声明中的名称既不是限定词也不是模板ID,并且声明是函数或详细类型说明符,则查找确定实体是否先前已声明不应考虑最内层封闭命名空间之外的任何范围”(7.3.1.2/3)。因此查找不应找到全局 FriendClass,因此朋友声明在 MyLib 命名空间中引入了新的 FriendClass。我是对的,而通常的嫌疑人毕竟是错的。
标签: c++ gcc friend dynamic-library