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()またはを指定する必要がありますthis->data_.clear()。なぜこうなるのかは、こちらをご覧ください

于 2012-08-20T04:44:08.613 に答える
5

テンプレートの場合、コンパイラはメンバーが本当に基本クラスから来ているかどうかを判断できません。したがって、thisポインタを使用すると動作するはずです:

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

Base<T>コンパイラが Derived クラス定義を調べるとき、どれが継承されているかはわかりません(T不明であるため)。また、パラメーターまたはグローバルに表示される変数data_のいずれでもありません。templateしたがって、コンパイラはそれについて不平を言います。

于 2012-08-20T04:43:51.250 に答える