32
#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;
}

我无法编译这个程序。我得到:

main.cpp:22: error: 'data_' was not declared in this scope

拜托,你能解释一下为什么在课堂上看data_不到吗?Derived

4

2 回答 2

44

要解决此问题,您需要指定Base<T>::data_.clear()or this->data_.clear()。至于为什么会这样,请看这里

于 2012-08-20T04:44:08.613 回答
5

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

void clear()
{
   this->data_.clear();
}

当编译器查看 Derived 类定义时,它不知道哪个Base<T>被继承(因为T未知)。也不data_是任何template参数或全局可见变量。因此编译器抱怨它。

于 2012-08-20T04:43:51.250 回答