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,派生类中定义的类无法在基类中访问 的相关文章

  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 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