将未定义的类设为友元,然后再定义它

2023-12-08

交一个不认识的朋友

template<typename T>
class List
{
protected:

    class a {
        int x;
        int y;
    private:
        friend class b;  // <------------ Why this is not an error? 
    };

    template <typename U > class b {  //If that is not a error this should be an error
        int z;
        U y;
    };

    public:
        List() {
            a* ptr = (a *)new unsigned char[sizeof(a)];
        }
};

int main() {
    List<int>  mylist;
}

请浏览此链接,我在代码中将我的问题作为评论。 我正在努力让另一个班级成为我班级的朋友。但在交朋友时并不知道那个班级。允许它的 C++ 规则是什么。 后来我以这样的方式定义该类,它与朋友声明不兼容。为什么不抛出错误。 谢谢


是的,你的代码是invalid!这是一个有趣的展示,展示了模板如何以微妙的方式改变代码的含义。下面的代码is valid:

class List
{
public:
    class a {
        typedef int type;
        friend class b; // that's fine!
    };

    template <typename U > class b;
};

class b {
  List::a::type an_int; // allowed to access private member
};

标准表示为 7.3.1.2/3

如果非本地类中的友元声明首先声明了一个类或函数83),则该友元类或函数是最内层封闭命名空间的成员。

什么时候是“首次宣布的班级”?那里也这么说

当查找声明为友元的类或函数的先前声明时,并且当友元类或函数的名称既不是限定名称也不是模板 ID 时,不考虑最内部封闭命名空间范围之外的范围。

“class b”的查找从 7.1.5.3/2 委托给 3.4.4,3.4.4 又委托给 3.4/7 处的非限定名称查找。现在的所有问题是模板名称“b”在友元声明类 a 中是否可见。如果不是,则找不到该名称,并且友元声明将引用全局范围内新声明的类。 3.3.6/1关于它的范围说

类中声明的名称的潜在范围不仅包括以下声明区域 名称的声明符,还有所有函数体、默认参数和构造函数 ctor- 该类中的初始值设定项(包括嵌套类中的此类内容)。

忽略一些迂腐的观点,这些观点可能会使此措辞不适用于此处(这是一个缺陷,但在该段落的 C++0x 版本中已修复,这也使其更易于阅读),此列表不包括友元声明,因为该模板名称可见的区域。

However,友元是在类模板的成员类中声明的。当成员类被实例化时不同的查找适用 - 查找在类模板中声明的朋友名称!标准说

可以在类模板中声明友元类或函数。当模板被实例化时, 它的朋友的名字被视为好像专业化已在其实例化点明确声明。

所以下面的代码是无效的:

template<typename T>
class List
{
public:
    class a {
        typedef int type;
        friend class b; // that's fine!
    };

    template <typename U > class b;
};

// POI
List<int>::a x; 

当这导致List<int>::a要隐式实例化,名称a查找“// POI”,就好像已经声明了显式专业化一样。在这种情况下,模板List::b已经声明了,并且此查找将命中它并发出错误,因为它是模板而不是非模板类。

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

将未定义的类设为友元,然后再定义它 的相关文章

  • WPF 中的屏幕分辨率问题?

    我将在 WPF 中使用以下代码检测分辨率 double height System Windows SystemParameters PrimaryScreenHeight double width System Windows Syste
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

  • 使用正则表达式替换 CSV 中引号之间的逗号

    例如 我们有一个像这样的字符串 COURSE 247 28 4 2016 12 53 Europe Brussels 1 Verschil tussen merk product en leveranciersverantwoordelij
  • 没有焦点的按键事件

    我正在编写一个简单的 GUI 它将在特定点打开一个 opencv 窗口 这个窗口有一些非常基本的 keyEvents 来控制它 我想通过一些功能来推进这一点 由于我的 QtGui 是我的控制器 因此我认为使用 KeyPressedEvent
  • 闪亮的应用程序:保持面板在多个视图中保持一致

    在 Shiny 中 我想保持一些面板 下面的面板 1 在多个视图 下面的绘图视图 1 和 2 中保持一致 下面我可以在 Plotview2 中显示 panel1 但是 该面板在此视图中不起作用 目标是能够通过多个 绘图视图 拥有一些一致的
  • 我对值初始化的尝试被解释为函数声明,为什么 A a(()); 不被解释为函数声明?解决这个问题?

    Stack Overflow 教给我的许多东西中 有一个就是所谓的 最令人烦恼的解析 它通常用这样的行来演示 A a B declares a function 虽然对于大多数人来说 直观上这似乎是一个对象的声明a类型的A 暂时采取B对象作
  • 无法删除 docker 镜像

    在设置新的构建机器 CentOS 7 Docker CE 17 12 0 ce 时 我做了一个简单的测试 docker run it rm ubuntu bash 效果很好 但现在我无法删除 Ubuntu 映像 build docker i
  • 在 Spark 中迭代每一列并找到最大长度

    我是 Spark scala 的新手 我有以下情况 我在集群上有一个表 TEST TABLE 可以是配置单元表 我正在将其转换为数据框 作为 scala gt val testDF spark sql select from TEST TA
  • 使用向量代替循环

    我有一个巨大的矩阵 我刚刚给出了一个具有大小的矩阵的示例 1 1000000 我正在使用简单Loop 我不喜欢使用Loop 来找到k where k k ii abs a ii 1 2 a ii a ii 1 a ii 1 2 a ii a
  • GridLayout 和行/列跨度问题

    The Android 开发者博客文章介绍GridLayout显示了跨度如何影响自动索引分配的图表 我正在尝试使用GridLayout 这是我到目前为止所拥有的
  • MySQL、utf8_general_ci 和西里尔字符

    MySQL 版本 4 1 及其排序规则 utf8 general ci 似乎不喜欢特定的西里尔字符 和 适用于 MySQL 5 0 及以上版本 由于该字段用于存储俄语以外的语言 英语 爱沙尼亚语 德语 的信息 因此更改排序规则的类型是不可想
  • 在 AWS IOT 中调用 getShadow/updateShadow 时出现 ForbiddenError 403

    我有带有联合 ID 的经过身份验证的用户 但是当我尝试访问 AWS IOT 内容时 我收到了这个错误 这让我发疯 我正在关注iot sample code 所有相关凭证也都是正确的 MQTTHelper credentialsProvide
  • 重定向子进程的输出

    有多种方法可以重定向子进程的输出 using freopen 3 using dup 3 using popen 3 如果需要的话 应该选择什么是执行子进程并将其输出保存在给定文件中 非常类似于ls gt files txt works s
  • 在多页中获取 Activecontrol

    我正在尝试获取该名称Listbox我刚刚选择的 ListBox1 Caveat ListBox1位于Multipage1 在第一个选项卡上 Private Sub ListBox1 Click Dim m As String m Me Ac
  • 在 Ubuntu 14.04 上的 Python 2.6 上安装 M2Crypto 0.20.1

    我需要在 Ubuntu 14 04 上从 Python 2 6 的源代码编译并安装 M2Crypto 0 20 1 我现在无法迁移到 Python2 7 但我们正在计划这样做 我安装了Python2 6https launchpad net
  • 使用 Sass 定制引导程序;我到底应该在我的 scss 文件中导入 bootstrap 吗?

    在尝试使用 Sass 自定义引导程序时 我注意到覆盖默认引导程序变量似乎以一种不连贯的方式工作 并且希望有人可以解释到底发生了什么导致这种行为 某些变量似乎只有在导入 bootstrap 之前声明时才会被覆盖 其他变量似乎只有在导入 boo
  • 当密钥未翻译时使用默认语言后备

    我可以使用默认语言 例如英语 作为其他语言的 Localized strings 文件中的未翻译键吗 为此 您可以使用英文单词作为 Localized strings 文件中的键 另一种方法是检查 NSLocalizedString 的结果
  • 如何在悬停子元素时更改父元素的颜色

    我有一个带有社交链接的 div 当悬停任何具有不同颜色的锚点时 我想使背景颜色填充整个 div 具体取决于悬停的链接 目前 背景仅在锚文本下方发生变化 我正在研究使用纯 CSS 为整个父级填充子级背景颜色的方法 social width 4
  • JPA:如何在静态 JPA 元模型中对 NUMBER 列执行 LIKE?

    我确实有一个带有 NUMBER 实际上是 BigDecimal 不要问为什么 列的静态元模型 现在我想对该数字列进行 LIKE 查询 CriteriaBuilder cb cb like entity get Entity numberco
  • 如何链接多个 Promise?

    我不太确定 也许我错过了一些明显的东西 但我不知道如何链接两个承诺 我的基于回调的代码看起来像这样 async series function cb Create the directory if the nodir switch isn
  • 为什么 Erlang 中阶乘不会溢出堆栈?

    module demo export factorial 1 factorial 0 gt 1 factorial N gt N factorial N 1 阶乘不是尾递归 但为什么它不会溢出堆栈 我能够在没有堆栈溢出的情况下获得 100
  • 将未定义的类设为友元,然后再定义它

    交一个不认识的朋友 template