模板类与私有继承

2024-03-05

为什么有些编译器坚持限定模板基类的公共成员,而不要求非模板类的成员相同?请看下面的代码清单:

模板类:

#include <iostream>

using namespace std;

template <class T>
class TestImpl {
public: // It wont make a difference even if we use a protected access specifier here
    size_t vval_;
    TestImpl(size_t val = 0) : vval_(val) { }
};

template <class T>
class Test : public TestImpl<T> {
public:
    Test(size_t val) : TestImpl<T>(val) {
        cout << "vval_ : " << vval_ << endl; // Error: vval_ was not declared in this scope
        //! cout << "vval_ : " << TestImpl<T>::vval_ << endl; // this works, obviously
    }
};

int main() {
    Test<int> test1(7);

    return 0;
}

非模板类:

#include <iostream>

using namespace std;

class TestImpl {
public: // It wont make a difference even if we use a protected access specifier here
    TestImpl(size_t val = 0) : vval_(val) {}
    size_t vval_;
};

class Test : public TestImpl {
public:
    Test(size_t val) : TestImpl(val) {
        cout << "vval_ : " << vval_ << endl;
    }
};

int main() {
    Test test1(7);

    return 0;
}

上述代码清单之间的显着区别在于,第一个清单使用模板类,而第二个清单则没有。

现在,两个列表都可以正常编译微软的 Visual Studio 编译器(cl) 但第一个列表WONT与两者一起编译数字火星编译器(DMC)和适用于 Windows 的极简 GNU(MinGW - g++) 编译器。我会收到类似“vval_ 未在范围内声明”的错误 - 我显然明白它的含义。

如果我有资格访问TestImpl的公共变量vval_ using TestImpl::vval_该代码有效。在第二个清单中,当派生类访问基类时,编译器不会抱怨'vval_变量而不限定它。

关于两个编译器和可能的其他编译器,我的问题是为什么我应该能够直接访问(无需限定)vval_变量直接来自a从非模板类继承的非模板类,虽然我不能做同样的事情模板类继承自模板类?


你必须有资格vval_TestImpl<T>告诉编译器这取决于实际类型T in Test<T>(可能有一些部分/显式的专业化TestImpl<T>在定义之前声明Test<T>它的实例化将改变vval_在这种情况下。为了让编译器意识到这一点,你必须告诉vval_是(模板参数)相关的。

也可以看看http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html

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

模板类与私有继承 的相关文章

  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • jqgrid - 添加、编辑、删除不起作用

    我无法添加 编辑 删除 搜索 即使我输入 editrules required true 也不起作用 firebug 中的错误显示 isEmtpy 不起作用 这是我的代码 索引 html
  • 如何将 PayPal 与 Zend Framework 集成

    我是 Zend Framework 的新手 我需要集成 paypal 我不知道如何整合 PayPal 与 Zend 框架 任何 URL 或示例代码都会对我们有好处 请帮忙 提前致谢 这可能是一个很好的起点 http framework ze
  • 将父级中定义的脚本和样式注入到 iframe

    我正在构建一个组件库 css 框架 我想在 iframe 中演示它以将样式与页面隔离 我的设置是 Next js 文档 我想要演示的地方 和 Vite js 用于库代码 的 monorepo 用于渲染iframe我在用着react fram
  • Application Insights 每 5 分钟禁用一次 GET 请求

    我们在 Application Insights 方面遇到问题 有一个很多请求 https i stack imgur com U0veX png每 5 分钟到我们的应用程序服务 所有警报均被禁用 有谁知道这是什么以及如何禁用该请求的日志记
  • 当 HTTP 响应状态设置为 400 时,IIS 覆盖 HTTP 响应文本

    我正在构建一个带有 IIS 7 5 后端的 MVC 3 应用程序 在我的控制器上 我有允许用户添加 编辑域对象的操作方法 该操作处理 HTTP Post 有一个字符串返回值 其中包含保存过程中遇到的任何验证错误消息 以下是一种操作方法的示例
  • 将布尔数组初始化为 false

    我下面有这段代码 如何初始化每个元素 false boolean seats new boolean 10 我看到一个类似的问题 但是 第二行对我来说没有意义 你能解释一下第二行吗 Boolean array new Boolean siz
  • Javascript JQuery 替换标签

    我有一个内容可编辑区域 当用户完成编辑后 我会将数据保存到文件中 当用户首先使用一个浏览器 然后使用另一个浏览器时 由 contenteditables 创建的不同样式会导致代码混乱且不兼容 我想知道是否有什么办法可以替代 span sty
  • 在基类本身中定义“纯”虚函数是否有意义?

    定义的好处common基类中的虚函数的优点是我们不必在派生类中重新定义它们 即使我们定义pure基类本身中的虚函数 我们仍然必须在派生类中定义它们 include
  • SonarQube多模块和多子文件夹项目配置

    我有一个多模块sbt项目具有以下结构 parent child1 src group child1 src child2 src 我需要配置 SonarQube 来扫描 可能 嵌套文件夹中的所有模块 Note I have child1 a
  • 如何将 Readline 支持编译到 Ruby 中

    我的 ruby 版本是用editline 在 os x 上 我怀念以下功能readline in irb 如何重新编译 rubyreadline支持 Install readline to usr local 从头开始重新编译 ruby 并
  • 面向对象范式中松耦合和紧耦合有什么区别?

    任何人都可以描述面向对象范式中松耦合和紧耦合之间的确切区别吗 紧耦合是指一组类彼此高度依赖 当一个类承担太多职责时 或者当一个关注点分散在许多类而不是拥有自己的类时 就会出现这种情况 松耦合是通过促进单一职责和关注点分离的设计来实现的 松散
  • 自定义 Tumblr 的移动主题

    我希望让我的 Tumblr 博客对移动设备更加友好 并且我想在桌面主题旁边使用移动主题 我发现我可以使用移动设备的默认移动主题 但是有没有办法让我自定义移动主题 同时仍保留桌面的常规主题 只是为在搜索时发现此内容的人回答 我不希望他们被有关
  • 使用提示更改 div 内的文本[重复]

    这个问题在这里已经有答案了 好的 我在这个页面上有我想要做的事情的简化代码 我希望浏览器在加载页面时立即显示提示 询 问其姓名 一旦他们回答了他们的名字 它就会获取该变量 名称 并将其写入带有 id welcomeText 的 div 内
  • 清理 Tomcat 访问日志条目

    在我们的日志中 我们看到信用卡号码是由于人们使用 CC 信息点击我们应用程序中的一些 ULR 我不知道他们为什么这样做 我们希望清理这些信息 出于 PCI 考虑 甚至不将其保存到磁盘 因此 我希望能够在日志条目到达日志文件之前对其进行清理
  • 如果 Html 文件没有结尾的“/tr”标签或“/td”标签,则 HTML Agility Pack 无法完美读取该信息

    我正在使用 HTML Agility Pack 来解析 html 内容 我正在使用解析来提取表信息 有用 但是 如果没有结束 tr 标签或 td 标签 那么它就不能完美地解析该信息 其中没有结束 tr 标签或 td 标签 Like tabl
  • 将纯数据 Docker 容器从一台机器移动到另一台机器的正确方法

    我有一个数据库 Docker 容器 它将其数据写入另一个仅数据容器 纯数据容器有一个存储数据库数据的卷 是否有一种 docker 方式将这个纯数据容器从一台机器迁移到另一台机器 我读到了有关 docker save 和 docker loa
  • 使用斯坦福核心 NLP 的自定义关系提取模型未找到任何关系

    我使用斯坦福核心 NLP 训练了一个用于关系提取的自定义模型example http nlp stanford edu software relationExtractor html 但是当我运行模型时 它没有找到任何关系 即使我直接使用训
  • 列出 jQuery 中的所有表头

    如何列出 jQuery 中的所有表头 我的 HTML 表如下 table class edit table mobile optimised break words thead tr th Location th th Date from
  • 当方法以看似不相关的方式重载时,为什么 scala 无法编译?

    class A class B extends A object Sample def foo a Set A println Hi Set A def foo a String println Hi A Sample foo Set ne
  • 模板类与私有继承

    为什么有些编译器坚持限定模板基类的公共成员 而不要求非模板类的成员相同 请看下面的代码清单 模板类 include