模板基类 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++ 语法吗? 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 查找 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 中工作 但这似乎不对 这