5
#include <cstdlib>
#include <vector>
#include <iostream>

using namespace std;

class CFirstLevel {
 public:
    CFirstLevel (const string & _name): name (_name) {}
    // ...

 protected:

    string name;

};

template <typename T>
class CSecondLevel: public CFirstLevel {
 public:

    CSecondLevel (const string & _name): CFirstLevel (_name) {}

    virtual void PushBack (T) = 0;
    virtual void Print    (int I) {cout << data [I] << endl;}
    // ...

 protected:
    vector<T> data; 
};

template <typename A>
class CThirdLevel: public CSecondLevel<A> {
 public:
    CThirdLevel (const string & _name): CSecondLevel<A> (_name) {}

    virtual void PushBack (A _value) {data.push_back (_value);}

};


int main ( void ) {

    CThirdLevel<int> * pointer = new CThirdLevel<int> ("third");
    pointer -> PushBack (111);

    pointer -> Print (0);

    return 0;

}

コンパイラの戻りエラー:

main.cpp: メンバー関数 'virtual void CThirdLevel::PushBack(T)':

main.cpp:32:37: エラー: 'data' はこのスコープで宣言されていません

どこに問題がありますか?この継承を使用することは可能ですか?

4

2 に答える 2

2

マークが提案したように、使用

virtual void PushBack (A _value) { CSecondLevel<A>::data.push_back (_value); }

または、次のことができます

virtual void PushBack (A _value) { this->data.push_back (_value); }
于 2013-05-29T14:42:45.637 に答える