模板对象的C++继承(G ++编译器)

Pet*_* K. 5 c++ inheritance templates

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

}
Run Code Online (Sandbox Code Playgroud)

编译器返回错误:

main.cpp:在成员函数'virtual void CThirdLevel :: PushBack(T)'中:

main.cpp:32:37:错误:未在此范围内声明'data'

哪里有问题?有可能使用这种继承吗?

Mar*_*sen 6

问题在于CThirdLevel.该字段data无法解析CSecondLevel.您可以通过更改来解决此问题

virtual void PushBack (A _value) {data.push_back (_value);}
Run Code Online (Sandbox Code Playgroud)

virtual void PushBack (A _value) {CSecondLevel<A>::data.push_back (_value);}
Run Code Online (Sandbox Code Playgroud)

  • 或者`this-> data.push_back(_value);` (5认同)