C++ 模板:部分模板规范和友元类

2023-11-24

是否有可能以某种方式使部分模板规范成为友元类? IE。假设您有以下模板类

template <class T> class X{
    T t;
};

现在你有了部分特化,例如,对于指针

template <class T> class X<T*>{
    T* t;
};

我想要完成的是一切可能X<T*>是一个友元类X<S>对于任何人S. I.e. X<A*>应该是...的朋友X<B>.

当然,我想到了 X 中常见的模板友元声明:

template <class T> class X{
    template <class S> friend class X<S*>;
}

但是,这不能编译,g++ 告诉我:

test4.cpp:34:15:错误:' 的专业化template<class T> class X' 必须出现在命名空间范围内

test4.cpp:34:21:错误:部分专业化'X<S*>”宣称“朋友”

这是根本不可能的还是有一些解决方法?

我问的原因是我需要一个构造函数X<T*>从任意创建这个类X<S> (S必须是子类型T).

代码如下所示:

template <class T> class X<T*>{
    T* t;

    template<class S>
    X(X<S> x) : t(&(x.t))  {} //Error, x.t is private
}

现在,编译器当然会抱怨,x.t在构造函数中不可见,因为它是私有的。这就是为什么我需要一个部分专业化的朋友班。


在 C++ 中,您可以授予超出以下范围的访问权限private在四个层面上。

  • 完全地public访问(参见 pmr 的回答)
  • 继承层次结构中的访问(protected,此处无关)
  • 到基本模板friend(见这个答案)
  • 到非模板或完全专业化friend(太弱了,无法解决您的用例)

后两种友谊之间没有中间道路。

来自 C++ 标准第 14.5.4 节:

友元声明不得声明部分特化。

以下声明将允许您实现您所需要的。它使您可以自由地从任何其他专业化访问模板的任何专业化,但仍然仅限于X。它比您所要求的稍微宽松一些。

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

C++ 模板:部分模板规范和友元类 的相关文章

  • d3.js 强制布局是否允许动态 linkDistance?

    我使用力布局来表示有向未加权网络 我的灵感来自以下例子 http bl ocks org mbostock 1153292 http bl ocks org mbostock 1153292 我的问题是 在我的情况下 节点之间有更多的链接
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include
  • eXist - 加载 XSLT 集合() - URIResolver 抛出异常

    环境 eXist db 4 2 1 XQuery 3 1 XSLT 2 0 在 eXist db 中 我正在加载一个 XSLT 文件 其中包含对 eXist 中集合的引用 以便使用密钥对在那里找到的文档执行搜索 此引用似乎引发了撒克逊人的错
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 将带有 html 标签的纯文本转换为 html 字符串并在 Blazor 中呈现

    Sample var s p Sample text p 期待 Sample text 我希望它在浏览器上呈现 但我无法呈现它 它只是将 s 的整个值作为文本字符串输出 我已经尝试过 new HtmlString s 将其编码为HttpUt
  • 我如何才能获得 Jenkins 的工作范围凭证?

    首先抱歉 如果这个问题及其解决方案存在于某处 但我找不到它 我希望能够在工作中创建凭证 并且只能在该工作中使用 这是一种工作范围凭证 目前 凭证插件仅建议全局和系统范围 因此凭证可用于所有作业 凭据绑定插件似乎也没有解决我的问题 但公平地说
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • 使用 ASP.Net 和 Ajax 的登录页面

    我正在尝试使用 html ajax 和 ASP NET 制作登录页面 数据确实传递给 ajax 函数 但是当我调试 asp 页面时 用户名和密码以 NULL 发送 该代码应该获取用户名和密码 然后返回用户 ID html页面 div Use
  • gis计算点和多边形/边界之间的距离

    我想使用 python 计算一个点到一个国家边界之间的距离shapely 它应该工作得很好 point distance poly 例如在这里展示查找多边形形状上最近点的坐标 https stackoverflow com question
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm
  • 非 www .htaccess 重定向 - 忽略其他子域

    我有一个 非 www 的 htaccess 重定向 如下所示 RewriteEngine on RewriteCond HTTP HOST www RewriteRule http www HTTP HOST 1 R 301 L 这是工作
  • 将变量从调用它的父页面传递给 Vue 组件

    我有一个简单的表格 显示了我的所有数据 主文件 php table class table table bordered table hover thead tr th Job Name th th Job Description th t
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • html 表:thead 与 th

    它看起来像 根据示例这一页 http www w3 org TR html4 struct tables html无论如何 如果您使用THEAD 则不需要使用TH 真的吗 如果是这样 THEAD 与 TH 相比有何优点 缺点 The the
  • 从 Web 打印“原始文本”(ZPL)

    我们有很多旧的 ZPL 标签 我们希望能够从网络客户端打印它们 打印机连接到客户端而不是服务器 我们有一些想法 从 Silverlight 打印 不可行 似乎无法在不调用 COM 对象的情况下从 NET 打印 原始 到 Zebra 而这在普
  • 获取给定日期的周数

    例子 DD MM YYYY 1 1 2009 should give 1 31 1 2009 should give 5 1 2 2009 should also give 5 Format 1 2 2009 ww 回报6 那么 怎样才能得
  • 为什么 SSRS 报表从 SQL Server Reporting Services 运行时生成的数据与使用“预览”选项卡运行时生成的数据不同?

    我有一个运行我想要的数据的报表 从 预览 选项卡 即 或者在 VS 2010 中使用 F5 运行时 但是当我将报表 rdl 文件 上传到 SQL Server Reporting Services 并运行更新后的报表时从那里报告 它仍然显示
  • AWS CloudWatchLog 限制

    我正在尝试找到集中式解决方案来将我的应用程序日志记录从数据库 RDS 中移出 我本想使用 CloudWatchLog 但注意到 PutLogEvents 请求有限制 PutLogEvents 请求的最大速率为每秒 5 个请求 每个日志流 即

随机推荐

  • LINQ to Entities - 动态选择指定列

    我可以创建一个选择查询 仅检索 LINQ to 实体的特定列 代码中的静态 from Example in new Enities Table select new Example Column1 Example Column2 但我不知道
  • 在数据库中存储十六进制和十六进制字符的最佳数据类型

    我正在使用以太坊 API 我想将来自 api 的信息存储到 mysql 表中 地址数据如下所示 0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be 0x1d80982502f3bb75654df13aa32
  • Redis 复制和客户端输出缓冲区限制

    我遇到了 redis 复制问题 我无法弄清楚 Master 不断达到客户端输出缓冲区限制 主控配置 redis cli p 6380 config get client output buffer limit 1 client output
  • Microsoft Office 互操作程序集参考

    我有一个在 Visual Studio 2005 中开发的应用程序 我正在使用 ClickOnce 进行部署 我的解决方案包含两个项目 用 VB 编码的用户界面层和用 C 编码的类库 我的 C 类库有一些使用 Outlook 和 Excel
  • 我可以从 Firefox 缓存中删除特定文件吗?

    我正在开发一个 ASP net 应用程序 我必须经常更新我的 CSS 文件 我不想更新 from 中的文档频率设置about config在火狐浏览器中 我想让它默认 我使用 Firefox 作为理想的浏览器 如果我只是更新 CSS 文件
  • Mac OS X 10.8.4 上的 nc (netcat) 卡住

    我在 Mac OS X 上使用 nc 实用程序时遇到了一个小问题 我经常使用该实用程序作为快速但肮脏的解决方案来检查端口是否打开以及守护程序正在运行的版本 前几天我们部署了一组新计算机 我想验证它们正在运行什么版本的 sshd 而无需离开我
  • 创建变换以从一个矩形映射到另一个矩形?

    最简单的创建方法是什么AffineTransform它将坐标从一个矩形映射到另一个矩形 给出了浮点 双精度矩形 UPDATE 1 矩形可以完全不同 例如 0 0 1 1 和 150 14 1000 14 1 而且改造要统一改造 例如 矩形角
  • Google Cloud Pub/Sub 重试计数

    我们正在从不稳定的消息队列服务迁移到 Node JS 中的 Google Pub Sub 它似乎运行良好 但我们希望包括错误处理 我们希望限制特定消息的重试次数 例如在测试环境中重试 10 次 在生产环境中重试 100 次 现在 如果一条消
  • 如何在 Ember.js 中的控制器之间进行通信

    我想创建一个页面 其中左侧有固定视图 一些过滤器 这些视图应用于右侧的结果 例如 左侧是按流派 标题 创作年份过滤电影的过滤器 右侧是不同的图表和表格 它们根据所选的过滤器进行更新 所以我想在左边有一个固定的视图 然后在右边有一个会根据路线
  • 使用 node-mysql 中的 SSH 隧道连接到 MySQL

    当使用node mysqlnpm 包 是否可以使用 SSH 密钥而不是密码连接到 MySQL 服务器 您可以完全独立地完成 SSH 隧道组件 然后使用通过 SSH 建立隧道的 TCP 将 node mysql 或任何其他 sql 客户端 指
  • 我可以从堆栈中 POP 一个值,但将其放在 NASM Assembly 中的任何地方吗?

    NASM 程序集 Ubuntu 32 位程序 通常 当从堆栈中弹出一个值时 我会这样做 POP somewhere 进入寄存器或变量 但有时 我只是不想把它放在任何地方 我只想删除堆栈中的下一个元素 正在做 POP 就这样不行 我的一个解决
  • PHP:使用单词递增计数器函数(即第一、第二、第三等。)

    我一直在尝试找到一个使用单词递增计数器的函数 我知道可以使用带后缀的数字 即第一 第二 第三等 这是我得到的代码片段 function addOrdinalNumberSuffix num if in array num 100 array
  • JavaScript 以及为什么大写字母有时有效有时无效

    在 Notepad 中 我正在编写一个 JavaScript 文件 但有些东西不起作用 单击按钮时必须显示警报 但它不起作用 我使用了 Notepad 提供的自动完成插件 它为我提供了onClick 当我改变首都时C到一个小c 它确实有效
  • 如何保持后台运行的 iPhone 应用程序完全正常运行

    首先 我知道仅支持 voip 音频和位置应用程序在后台运行 并且它们只会在播放音频或使用位置服务等时运行 我想知道是否有一种方法可以让我的应用程序在后台完全运行 而不管对电池寿命的影响 这样 我的应用程序的用户就可以从设置中进行选择 以便在
  • 调用本机浏览器功能,即使它已被覆盖

    如果我有类似的东西 alert 0 在另一个脚本中 这是在另一个脚本中 我的代码无法在该脚本之前加载 怎么称呼原来的alert我的脚本中的方法 在覆盖原来的之前alert 保存 var origAlert alert alert 0 ori
  • HTML5 Canvas fillText 带有从右到左的字符串

    我试图在 HTML5 Canvas 的 2d 上下文上使用 fillText 方法来绘制用阿拉伯语编写的字符串 它工作得很好 直到我在字符串末尾添加了标点符号 然后标点符号出现在字符串的错误一侧 在开头 而不是结尾 就好像它是 ltr 而不
  • Safari History.db History_visits.visit_time 的格式是什么?

    从 Safari 查看 History db 时 有一个名为history visits其中有一列名为visit time 这是一个REAL价值 它具有诸如470799793 096987 那是什么格式 我希望以 12 08 2015 05
  • 在 Python 中使用 loadmat 加载 .mat 和 .m 文件

    我目前正在学习神经网络课程 并且我正在尝试加载 mat使用Python从文件scipy io loadmat filename 但我不断收到以下错误消息 ValueError 未知的 mat 文件类型 版本 101 58 当我尝试加载 m
  • 使用 Javascript 在 Parse.com 中获取多个相关对象的简单方法?

    我有一个 Player 类 玩家可以拥有 x 数量的奖杯 我有 Player objectId 需要获取他们所有奖杯的列表 在 Parse com 数据浏览器中 Player 对象有一列标记为 trophies Relation
  • C++ 模板:部分模板规范和友元类

    是否有可能以某种方式使部分模板规范成为友元类 IE 假设您有以下模板类 template