为什么 C++ 友元类只需要在其他命名空间中进行前向声明?

2024-04-02

假设我有一堂课F那应该是班级的朋友G(在全局命名空间中)和C(在命名空间中A).

  • 成为朋友A::C, F必须向前声明。
  • 成为朋友G,没有前向声明F是必要的。
  • 同样,一个类A::BF可以成为朋友A::C无前置声明

以下代码说明了这一点,并使用 GCC 4.5、VC++ 10 和至少一个其他编译器进行编译。

class G {
    friend class F;
    int g;
};

// without this forward declaration, F can't be friend to A::C
class F;

namespace A {

class C {
    friend class ::F;
    friend class BF;
    int c;
};

class BF {
public:
    BF() { c.c = 2; }
private:
    C c;
};

} // namespace A

class F {
public:
    F() { g.g = 3; c.c = 2; }
private:
    G g;
    A::C c;
};

int main()
{
    F f;
}

对我来说这似乎不一致。这是有原因的还是只是标准的设计决定?


C++标准ISO/IEC 14882:2003(E)

7.3.1.2 命名空间成员定义

第 3 段

每个名字首先声明在 命名空间是该组织的成员 名称空间。如果朋友声明 非局部类首先声明一个 类或函数 (这意味着类或函数的名称是不合格的)友元类 或函数是成员 最内层的封闭命名空间。

// Assume f and g have not yet been defined.
void h(int);
template <class T> void f2(T);
namespace A {
   class X {
   friend void f(X);  //  A::f(X) is a friend
      class Y {
         friend void g();  //  A::g is a friend
         friend void h(int);  //  A::h is a friend
         //  ::h not considered
         friend void f2<>(int);  //  ::f2<>(int) is a friend
      };
   };
   //  A::f, A::g and A::h are not visible here
   X x;
   void g() { f(x); }  // definition of A::g
   void f(X) { /* ... */}  // definition of A::f
   void h(int) { /* ... */ }  // definition of A::h
   //  A::f, A::g and A::h are visible here and known to be friends
}

Your friend class BF;是一个声明A::BF在命名空间 A 而不是全局命名空间中。您需要全局事先声明来避免此新声明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C++ 友元类只需要在其他命名空间中进行前向声明? 的相关文章

  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • JQuery 垃圾收集 - 这会干净吗?

    许多文章 例如msdn http msdn microsoft com en us library dd361842 28VS 85 29 aspx 已经说过 当涉及到循环引用时 在某些浏览器中无法清除循环引用DOM对象和一个JS obje
  • WinForms C# 中自定义对象类型的跨进程拖放

    这个问题 https stackoverflow com questions 1213074 winforms interop drag drop from winforms wpf与我感兴趣的内容很接近 但又不完全是 我有一个用 C 编写
  • 在 Tornadoweb 中禁用模板处理

    我必须使用 Tornado Web 作为我们现有 AngularJs 应用程序的 RESTful 后端 在 Angular 应用程序中大量使用 我想将龙卷风的角度文件作为静态文件提供 有没有办法禁用tornado的处理模板以避免与torna
  • Ruby on Rails 中的延迟作业如何工作?

    我对此很陌生 对延迟工作的工作原理不太困惑 我知道它会创建一个表并将作业放入表中 然后我需要运行 rake jobs work 启动后台进程 现在我的问题是 DJ 脚本是否每分钟检查一次表 当时间与 job at 时间匹配时 它会运行该作业
  • 删除与模型关联的文件 - django

    我的一个模型中有以下代码 class PostImage models Model post models ForeignKey Post related name images figure out a way to have image
  • Xamarin.Android 绑定无效操作码

    最近收到一个新的 Android SDK aar 来绑定在 Xamarin 中 最初开始绑定时 我收到错误 COMPILETODALVIK Uncaught translation error com android dx cf code
  • 如何解析xsd:dateTime格式?

    xsd dateTime 类型的值可以有多种形式 如描述于RELAX NG http books xmlschemata org relaxng ch19 77049 html 如何将所有表单解析为时间或日期时间对象 它实际上是一种非常受限
  • 如何通过我自己的模板使用内置密码重置/更改视图

    例如我可以指出url accounts password reset to django contrib auth views password reset在上下文中使用我的模板文件名 但我认为需要发送更多上下文详细信息 我需要确切地知道为
  • 使用python打印月份和日期

    我试图在 python 中仅打印月份和日期 如下所示 09 December 08 October 我怎么能这么做呢 Try this import datetime now datetime datetime now print now
  • 命令行参数 - 所需对象:'objshell.NameSpace(...)'

    我正在编写一个脚本 该脚本将利用 Windows 的内置功能来解压缩提供的 zip 文件 我对 vbscript 还很陌生 所以有些语法让我有点困惑 我正在使用一些现有代码并尝试修改它 以便它将采用命令行选项作为文件名 如果我使用命令行传递
  • 仅向一个应用程序发送广播意图,而不使用显式意图

    我有个问题 我正在做一个外部 android 服务 应用程序可以注册它来接收信息 信息通过广播从服务返回到应用程序 并通过broadcastReceiver 问题是如果我这样做sendBroadcast 任何应用程序都可以监听其他应用程序的
  • 结构末尾的大小为 0 的数组[重复]

    这个问题在这里已经有答案了 我正在学习的系统编程课程的教授今天告诉我们要定义一个末尾带有零长度数组的结构体 struct array size t size int data 0 typedef struct array array 这是一
  • 极长工作流程的 Cucumber 场景

    我们需要为一个功能测试一个漫长的步骤过程 从登录到许多模式对话框 多步骤表单以及不同角色的用户都在交互 我们如何将这个过程的各个部分分解为单独的场景 这是一个例子 Scenario New Manuscript Given I am on
  • 如何获取用户当前在 Spotify 应用程序中收听的内容的信息 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Android 应用程序 在后台运行并使用 Spotify SDK 能否获取用户当前在 Spotify Android 应用程序中收听
  • 是否有复杂的 Java WorkQueue API?

    我正在寻找具有以下功能的 WorkQueue API java util Queue兼容的 优惠 可选 集合语义 单处理和批处理 并发 当然 调度 different processing policies 等到下一次计划执行 如果批量大小
  • PowerPivot 中的滚动 12 个月总和

    在 PowerPivot Excel 2016 中 我编写了滚动 12 个月销售额总和的公式 如下所示 Rolling Sum CALCULATE Sales DATESBETWEEN Sales Date FIRSTDATE DATEAD
  • Python:使用 Openpyxl 读取大型 Excel 工作表

    我有一个 Excel 文件 其中包含大约 400 个工作表 其中 375 个工作表需要保存为 CSV 文件 我尝试过 VBA 解决方案 但 Excel 在打开此工作簿时遇到问题 我创建了一个 python 脚本来做到这一点 然而 它会迅速消
  • UISegmentedControl 截断段标题

    我的 iPhone 应用程序中有一个分段控件 在 ios6 上运行良好 但在 ios7 上 分段图块被截断 有足够的空间容纳文本 但无论如何都会截断它们 self segmentedControl segmentedControlStyle
  • tf.estimator.train_and_evaluate 出错了 评估精度和损失

    I use tf estimator train and evaluate训练和评估我的模型 这是我的代码 import tensorflow as tf import numpy as np from tensorflow contrib
  • 为什么 C++ 友元类只需要在其他命名空间中进行前向声明?

    假设我有一堂课F那应该是班级的朋友G 在全局命名空间中 和C 在命名空间中A 成为朋友A C F必须向前声明 成为朋友G 没有前向声明F是必要的 同样 一个类A BF可以成为朋友A C无前置声明 以下代码说明了这一点 并使用 GCC 4 5