模板类与私有继承

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(使用前将#替换为@)

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

随机推荐

  • 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