C++:使用 CRTP,派生类中定义的类无法在基类中访问

2024-03-22

这是(简化的)基类:

template <class T>
class SharedObject
{
protected:
    QExplicitlySharedDataPointer <typename T::Data> d;
};

这是派生的:

class ThisWontCompile : public SharedObject <ThisWontCompile>
{
private:
    friend class SharedObject;
    struct Data : public QSharedData
    {
        int id;
    };
};

有没有任何解决方法可以访问ThisWontCompile::数据 from 共享对象?对于从基础对象派生的对象到底能做什么、不能做什么?


这其实与可达性和友好性无关,而是与CRTP的使用有关。考虑以下也显示该问题的示例:

template <class T>
struct Base
{
    typedef typename T::Data Data;
};

struct ThisWontCompile : public Base<ThisWontCompile>
{
    struct Data { };
};

问题是ThisWontCompile在用作模板参数时不完整Base,因此只能用作不完整类型Base.

如需针对您的具体问题的一些解决方案,请查阅以下问题的答案这另一个问题 https://stackoverflow.com/questions/652155/invalid-use-of-incomplete-type,特别是 Martin 建议使用特征类,它基本上如下所示:

// Base
template <typename T>
struct BaseTraits;

template <typename T>
struct Base
{
    typedef typename BaseTraits<T>::Data Data;
};

// Derived
struct Derived;

template <>
struct BaseTraits<Derived>
{
    struct Data { };
};

struct Derived : public Base<Derived>
{
};

typename BaseTraits<Derived>::Data两者均可使用Derived and in Base. If Derived本身就是一个模板,您可以对特征类使用部分特化。

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

C++:使用 CRTP,派生类中定义的类无法在基类中访问 的相关文章

  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base

随机推荐

  • jQuery Validate - 仅当选中单选按钮时,才会选中一组复选框中的至少一个

    我正在使用 jquery 验证插件来确保一组三个复选框中至少有一个被选中并且工作正常 但我只想在选中单选按钮 Sim 时验证这些复选框 我不知道该怎么做 Demo http jsfiddle net TnmGr http jsfiddle
  • Kubernetes:使用 kubectl 修改机密?

    如何修改 Kubernetes 中的值secret using kubectl 我用以下方法创建了这个秘密kubernetes create secret generic 但似乎没有办法修改秘密 例如 向其中添加新的秘密值 或者更改其中的秘
  • std::包含自身的容器的变体

    我有一个二进制格式 我正在为其编写编码器和解码器 几乎所有二进制类型都直接映射到基元 除了两种容器类型 列表和映射类型 之外 它们可以包含格式中的任何其他类型 包括它们本身 这些感觉就像他们只是想成为一个 typedefstd varian
  • 如何以编程方式启用 Visual Studio 扩展

    我创建了一个 Visual Studio 扩展并将其打包在 Visual Studio 安装程序中 现在 当我安装安装程序时 vsix 已安装 并且也可以在扩展管理器窗口中看到 但处于禁用状态 我尝试过为扩展添加注册表项等方法 但同样没有用
  • 在 64 位 Python 上使用 sys.platform=='win32' 检查是否安全?

    区分在 Windows 和其他操作系统 通常是 Linux 上运行的 Python 应用程序的通常检查是使用条件 if sys platform win32 但我想知道在过去几年64位Python得到更广泛使用的今天使用安全吗 32 真的意
  • 计算列的时间总和

    我有这张表 table border 1 width 100 tbody tr td Total duration time td td class total duration time td tr tbody table table b
  • 将 Chrome 开发控制台转储到文本文件?

    有时 当我尝试调试用户在使用我的 Chrome 扩展程序 StayFocusd 时遇到的问题时 访问控制台日志会很有用 现在我只是要求他们将日志复制并粘贴给我 但如果我能够以编程方式生成一个文件 他们可以通过电子邮件发送给我 那就更好了 那
  • 函数指针的函数模板专业化

    我有一个清理函数 我只想在 传统 指针类型上运行 我的问题是函数模板 我可以将函数限制为仅指针 但是由于函数指针和常规指针之间的转换规则差异 我遇到了问题 The Sanitize 函数需要针对大量类型运行 其中一些是指针 需要进行清理 其
  • 上传文件 spring boot 所需的请求部分“文件”不存在

    我想为我的 Spring Boot 应用程序添加上传功能 这是我的上传休息控制器 package org sid web import java io BufferedOutputStream import java io File imp
  • 使用 numpy 数组左移大量数字

    Python确实可以左移一位大整数 1L lt lt 100 1267650600228229401496703205376L 但 NumPy 似乎有一个问题 a np array 1 2 100 output np left shift
  • 复制大文件时如何避免 StorageFile.CopyAsync() 抛出异常?

    我将通过以下方式将一些文件从视频库复制到我的应用程序存储StorageFile CopyAsync 方法 但如果文件大小超过1GB 则会抛出异常 如下所示 类型 System Runtime InteropServices COMExcep
  • 如何以编程方式在 Android 中加入 2 个联系人?

    我需要知道是否可以加入两个或多个联系人 以编程方式 使用联系人 android API 或其他方式 例如 我有一个联系人 Axel Rose 有一个电子邮件帐户和电话号码 我注意到一些应用程序 如 Whatsapp Facebook 和 S
  • 如何更改物料表操作字段图标

    actions icon edit tooltip Edit User onClick event rowData gt alert You are editing rowData name icon delete tooltip Dele
  • 从物化路径构建 JSON 树

    我计划在 MongoDB 中使用物化路径来表示树 并且需要将物化路径转换回 JSON 树 前任 物化路径 var input id 0 path javascript id 1 path javascript database id 2 p
  • 将本地 TIMESTAMP 转换为 UTC 时间

    我有两张带有时间戳的表 TABLE1带有当地时间的 TIMESTAMP TABLE2带有 UTC 时间戳 我需要做类似的事情 select count from TABLE1 where TIME STAMP gt TABLE2 TIME
  • 我可以从打开的文件中读取新数据而不重新打开它吗?

    考虑有一个文件test txt其中有一些随机文本 现在我们运行以下代码 f open test txt r f read 现在我们将数据附加到test txt来自其他一些进程 有没有办法不用重新打开f我们可以read新数据 这个问题仅限于P
  • 我如何使用 ie6 测试我的网站

    我在最新的 Firefox 中开发了一个网站 然后在一台只有 ie6 的机器上展示了它 看起来很糟糕 无论如何 我可以测试它在 IE6 中的外观 而无需实际下载 我看到ie8有一个兼容模式 以显示它在ie7中的样子 ie 6有类似的东西吗
  • Cassandra 0.8 = 提供什么样的“行计数”功能?

    同时支持 Cassandra 中的 行计数 在 CF 中 a 随机分区器 b OrderPreservingPartitioner http www datastax com dev blog whats new in cassandra
  • 如何删除 TextBox 控件的默认上下文菜单? C#

    如何删除默认的上下文菜单TextBox控制 有属性可以禁用它吗 谢谢 您还可以设置ShortcutsEnabled财产给false 这将删除默认的上下文菜单和所有剪贴板功能 我想这就是你试图抑制菜单的原因 除了故意阻止用户使用复制 粘贴之外
  • C++:使用 CRTP,派生类中定义的类无法在基类中访问

    这是 简化的 基类 template