模板基类 typedef 和函数有更好的 C++ 语法吗?

2024-05-03

我的代码可以在 VC9 (Microsoft Visual C++ 2008 SP1) 中正常编译,但不能在 GCC 4.2 中编译(在 Mac 上,如果这很重要的话)。如果我堆积足够的限定符和关键字,我可以强制它在 GCC 中工作,但这似乎不对。

这是展示我的问题的最小代码示例:

template< typename N >
struct B {
    typedef N n_type;                     // can derived class access typedef?
    void foo() {}                         // can derived class access function?
};

template< typename N >
struct D : public B<N> {

    typedef B<N> b_type;
    typedef typename b_type::n_type bn_type;

    void f1( n_type ) {}                  // ERROR: 'n_type' has not been
                                          // declared

    void f2( typename B<N>::n_type ) {}   // OK, verbose

    void f3( b_type::n_type ) {}          // ERROR: 'struct B<N>::n_type' is 
                                          // not a type

    void f4( typename b_type::n_type ) {} // OK, verbose

    void f5( bn_type ) {}                 // OK, verbose typedefs

    void f6() { foo(); }                  // ERROR: there are no arguments to
                                          // 'foo' that depend on a template
                                          // parameter, so a declaration of
                                          // 'foo' must be available

    void f7() { b_type::foo(); }          // OK, verbose

};

我期望从另一个模板类派生的模板类能够直接使用继承的 typedef 和函数是错误的吗?有没有比我迄今为止想出的更好的方法来做到这一点?


我期望从另一个模板类派生的模板类能够直接使用继承的 typedef 和函数是错误的吗?

是的,这通常不会像您期望的那样工作。 C++ 名称查找规则指定仅在依赖于模板参数的名称(如果它是“从属名称”)时才在模板化基类中搜索该名称。如果名称不依赖于模板参数,则不会在那里搜索它。 (另请参阅这个 C++ FAQ Lite 条目 http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19)

要从依赖基类调用函数,最简单的方法是使用this->, since this始终隐式地是一个从属名称:

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

模板基类 typedef 和函数有更好的 C++ 语法吗? 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 查找 Java 中的内存使用情况

    以下是我需要解决的场景 我想出了两种解决方案 我需要维护从数据库获取的数据的缓存 以便在 Swing GUI 上显示 每当我的 JVM 内存超过其分配内存的 70 时 我需要警告用户有关过度使用的情况 一旦 JVM 内存使用率超过 80 那
  • 根据 Google BigQuery 中的查询结果创建表

    我们正在使用谷歌大查询 https developers google com bigquery 通过Python API 如何根据查询结果创建一张表 新表或覆盖旧表 我回顾了查询文档 https developers google com
  • 在 Spring boot 中运行时指定 MongoDb 集合名称

    我试图在两个不同的微服务中重用现有的 EmployeeRepository 代码 见下文 以将数据存储在两个不同的集合中 在同一数据库中 Document collection employee public interface Emplo
  • SQL SERVER 字符串中的掩码字符

    如何替换 SQL SERVER 中字符串中 x 和 y 字符之间的字符 例如 如果我有 TEST123456 最后有 TE 56 我不知道字符串有多长 但我知道我需要屏蔽字符串中 x 和 y 之间的字符 你可以使用REPLICATE htt
  • Printf:Java 和 C 实现的差异

    今天我发现我无法使用 将宽度或精度参数传递给 Java 的实现printf 也就是说 以下论证printf在 C 中有效 但在 Java 中无效 d 10 3 d 10 3 0 d 10 3 5f 11 1 0 9 11 f 5 1 0 9
  • 基于 Netsuite 令牌的 API 调用中的身份验证不明确

    我正在尝试使用基于令牌的身份验证对 Netsuite API 进行 SOAP 调用 我有一个从 WDSL 生成的 C 客户端 它正在发送以下请求 已替换机密
  • JQuery 文件上传:在 data.submit() 上发送两个请求

    我正在尝试使用在我的应用程序中上传视频回形针 and jquery 文件上传 rails 我跟着使用回形针和 jquery 上传文件 https 5minutenpause com blog 2013 09 04 multiple file
  • Spark scala - 按数组列分组[重复]

    这个问题在这里已经有答案了 我对 Spark Scala 很陌生 感谢你的帮助 我有一个数据框 val df Seq a a1 Array x1 x2 a b1 Array x1 a c1 Array x2 c c3 Array x2 a
  • 获得列表并集的最快方法 - Python

    有一个 C 比较可以从列表列表中获取列表的并集 找到集合并集的最快方法 https stackoverflow com questions 11362002 the fastest way to find union of sets 还有其
  • 当我启动虚拟机时“VT-x 不可用”[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我使用 VMWare 软件创建了一个虚拟机 但在启动虚拟机时出现错误 它说 VT x 不可用 00 00 03 916 NAT zone nm mbu
  • iFrame 应用程序。权限请求?

    我想在用户首次单击我的 iFrame Facebook 应用程序时请求权限 问题是我见过的例子迫使用户单击按钮来加载http www facebook com authorize php http www facebook com auth
  • Android:加速度传感器中的z值范围在不同设备上不同

    我想检测设备是否面朝上 不是成角度 而是平放在地面上 在某些面朝上的设备上 z 值将返回 9 10 之间的值 大多数设备 然而 在 Nexus 7 上 对于面朝上 z 值将返回 6 8 之间的值 我的代码是 if z value gt 9
  • Android 工具栏:横向模式下的小标题文本

    我正在 Android 上测试新的 Toolbar 和 AppCompat 主题 但遇到了问题 我的工具栏标题文本在纵向模式下看起来是正常大小的 但在横向模式下它变得相当小 尽管我没有在代码中执行任何操作来更改标题的文本大小 以下是屏幕截图
  • MongoDB 在转换回 Java 对象时出现“NumberLong/$numberLong”问题

    我有一个 json 类似于 Header name TestData contactNumber 8019071740 如果我将其插入到 mongoDB 中 它将类似于 id ObjectId 58b7e55097989619e4ddb0b
  • 使用 Chrome TTS 的 SSML

    我试图通过强调等方式让 TTS 句子更加清晰 我正在使用Chrome TTS API http developer chrome com extensions tts html 这表明它接受SSML 格式的文档 http www w3 or
  • Java 8 Spliterator 中使用的奇怪循环[重复]

    这个问题在这里已经有答案了 有谁知道为什么java util Spliterator当循环体为空时 实现使用 do while 而不是 while 循环 例如 实施forEachRemaining is default void forEa
  • 轻量级 Windows 应用程序的最佳开源示例是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Requests/aiohttp:关闭响应对象

    我对是否需要感到有点困惑 close 两者中的响应对象requests and aiohttp 请注意 这是一个单独的实例方法 而不是session close 我说的是响应对象本身 Does Response requests or Cl
  • MySQL 相当于 ORACLES 的rank()

    Oracle 有 2 个函数 rank 和dense rank 我发现它们对于某些应用程序非常有用 我现在正在 mysql 中做一些事情 想知道他们是否有与这些相同的东西 没有什么直接等效的 但你可以用一些 不是非常有效的 自连接来伪造它
  • 模板基类 typedef 和函数有更好的 C++ 语法吗?

    我的代码可以在 VC9 Microsoft Visual C 2008 SP1 中正常编译 但不能在 GCC 4 2 中编译 在 Mac 上 如果这很重要的话 如果我堆积足够的限定符和关键字 我可以强制它在 GCC 中工作 但这似乎不对 这