首页 >后端开发 >C++ >为什么我无法访问模板派生类中基类的受保护成员?

为什么我无法访问模板派生类中基类的受保护成员?

Barbara Streisand
Barbara Streisand原创
2024-11-01 11:38:02216浏览

Why Can't I Access Protected Members of My Base Class in a Template Derived Class?

了解模板继承和非依赖名称查找

考虑以下代码片段:

<code class="cpp">// arrayListType.h
template <class elemType>
class arrayListType {
protected:
    elemType *list;
    int length;
};

// unorderedArrayListType.h
template <class elemType>
class unorderedArrayListType: public arrayListType<elemType> {
};

// main1.cpp
unorderedArrayListType<int> intList(25);</code>

编译此代码代码结果报错:“length was notclarified in thisscope”,说明父类arrayListType的受保护变量在继承类unorderedArrayListType中不可见。

这是由于一个概念称为非依赖名称查找,它定义编译器如何解析对模板内非依赖名称的引用。非依赖名称是那些不依赖于模板参数的名称,例如成员变量或成员函数名称。

在这种情况下,arrayListType 中的受保护变量是非依赖名称,并且它们没有显式地表示在 unorderedArrayListType 类定义中定义。编译器无法确定这些名称存在于继承的类中,因此会报告错误。

修复错误

解决此错误有两种常见方法:

使用这个->前缀:

用此前缀非依赖名称->显式指示它们引用继承的成员:

<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> {
public:
    void insertAt(int location, const elemType& insertItem) {
        this->length++;
        this->list[location] = insertItem;
    }
};</code>

使用声明:

使用声明显式声明继承类中的非依赖名称:

<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> {
public:
    using arrayListType<elemType>::list;
    using arrayListType<elemType>::length;

    void insertAt(int location, const elemType& insertItem) {
        length++;
        list[location] = insertItem;
    }
};</code>

这两种方法都可以有效地向编译器传达非依赖名称属于继承类的信息,并允许编译成功进行。

以上是为什么我无法访问模板派生类中基类的受保护成员?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn