【问题标题】:Friend definition doesn't work with gcc4.9好友定义不适用于 gcc4.9
【发布时间】: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


【解决方案1】:

使用friend class ::FriendClass; 通过这样做,您告诉编译器在 class FriendClass 定义的全局命名空间中查找,而不是在当前命名空间中查找。

同时使用:

my_namespace::MyLib* my_lib = get_my_lib_somehow();

【讨论】:

  • 因为通过写“朋友类FriendClass;”你告诉编译器只查看当前命名空间,而不是全局命名空间。
  • 如果您没有明确指定范围,Unqualified name lookup 应该会找到名称。问题是为什么它在这里不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多