首页 > 后端开发 > C++ > 如何在 C 中访问模板化父类中受保护的继承变量?

如何在 C 中访问模板化父类中受保护的继承变量?

Patricia Arquette
发布: 2024-12-10 07:56:12
原创
413 人浏览过

How Can I Access Protected Inherited Variables in Templated Parent Classes in C  ?

访问模板化父类中的继承的受保护变量

尝试从 C 中的模板化父类访问受保护的继承变量时会出现此问题。考虑以下 C 代码:

template<class T> class Foo {
    protected:
        int a;
};

template<class T> class Bar : public Foo<T> {
    protected:
        int b;
};

template<class T> int Bar<T>::Perna(int u) {
    int c = Foo<T>::a * 4; // This works
    return (a + b) * u;    // This doesn't
}
登录后复制

在这种情况下,GCC 版本 3.4.6 及更高版本在尝试访问继承的 Foo 类的受保护变量 a 时会引发错误。较旧的编译器,包括 GCC 2.96 和 MSVC 6-9,允许此访问而不会出现问题。

错误解释

发生错误的原因是,根据 C 标准,不合格在模板定义期间必须查找模板中的名称。但是,在模板定义时可能不知道依赖基类(例如本例中的 Foo)的定义。这种不确定性阻碍了不合格名称的解析。

标准合规性

GCC 3.4.6 及更高版本所表现出的行为符合 C 标准。通过遵守标准,这些编译器可确保代码的正确性和行为在不同平台和编译器之间保持一致。

解决方案

要解决此问题并访问受保护的继承对于变量,可以使用变量的限定名称(例如 Foo::a)或使用“using”声明。例如:

template<class T>
int Bar<T>::Perna(int u) {
    int c = this->a * 4; // Access using the qualified name
    c = a * 4;          // Access using the "using" declaration
}
登录后复制

在此修改后的代码中,限定名称或“using”声明显式指定 a 变量的来源,允许编译器正确解析它。

以上是如何在 C 中访问模板化父类中受保护的继承变量?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板