首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >派生类中受保护的成员“未在此范围内声明”

派生类中受保护的成员“未在此范围内声明”
EN

Stack Overflow用户
提问于 2012-08-20 12:40:26
回答 2查看 16.6K关注 0票数 31
代码语言:javascript
复制
#include <vector>
#include <iostream>

template <class T>
class Base
{
protected:
    std::vector<T> data_;
};

template <class T>
class Derived : public Base<T>
{
public:
    void clear()
    {
        data_.clear();
    }
};

int main(int argc, char *argv[])
{
    Derived<int> derived;
    derived.clear();
    return 0;
}

我不能编译这个程序。我得到了:

代码语言:javascript
复制
main.cpp:22: error: 'data_' was not declared in this scope

请解释一下为什么在Derived类中看不到data_

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-20 12:44:09

要解决此问题,您需要指定Base<T>::data_.clear()this->data_.clear()。至于为什么会发生这种情况,请参阅here

票数 42
EN

Stack Overflow用户

发布于 2012-08-20 12:43:51

在模板的情况下,编译器无法确定成员是否真的来自基类。所以使用this指针,它应该是有效的:

代码语言:javascript
复制
void clear()
{
   this->data_.clear();
}

当编译器查看派生类定义时,它不知道继承了哪个Base<T> (因为T是未知的)。此外,data_不是template参数或全局可见变量中的任何一个。因此,编译器对此进行了抱怨。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12032345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档