在此代码片段中:
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中文网其他相关文章!