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

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

Patricia Arquette
发布: 2024-11-30 05:30:10
原创
958 人浏览过

How Can I Access Inherited Protected Variables from a Templated Parent Class in C  ?

从模板化父类访问继承变量

在此代码片段中:

template<class T> class Foo
{
public:
  Foo() { a = 1; }

protected:
  int a;
};

template<class T> class Bar : public Foo<T>
{
public:
  Bar() { b = 4; };

  int Perna(int u);

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
}
登录后复制

较新版本的 GNU C 编译器(例如 3.4) .6 和 4.3.2) 报告错误:

error: `a' was not declared in this scope
登录后复制

在 Bar 特化中访问基类 Foo 的受保护变量 a 时。

标准一致性

较新的 GCC 版本遵循 C 标准,它指定模板中的非限定名称是非相关的,必须在模板定义期间解析。由于此时可能不知道依赖基类的定义,因此无法解析不合格的名称。

基本原理

防止访问依赖基类中的不合格继承成员可确保模板定义明确并且独立于其专业化。这确保了模板的语义对于不同的专业化保持一致。

解决方案

要访问 Bar 中继承的变量,您可以使用限定名称:

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

或者,您可以使用 using 声明:

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

此语法通知编译器Bar 的作用域引用了 Foo 基类的 a 变量。

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

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