访问模板化父类中的继承的受保护变量
尝试从 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
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中文网其他相关文章!