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

标签 c++ templates inheritance

#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: 错误:“数据”未在此范围内声明

哪里出了问题?是否可以使用这种继承?

最佳答案

问题出在 CTirdLevel 中。字段 data 无法从 CSecondLevel 解析。您可以通过更改

来解决此问题
virtual void PushBack (A _value) {data.push_back (_value);}

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

关于模板对象的 C++ 继承(G++ 编译器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16816843/

相关文章:

java - 从其他语言(如 Java、PHP、Perl、Python 等)调用 C/C++ 代码的最佳方式是什么?

templates - 在 D 中的模板化方法中条件使用局部变量

Python - 在子类方法定义中指定精确参数

Java:对于UML图中仅存在于父类(super class)中的抽象方法应该做什么?

c++ - 为进程计时(Windows 7 DOS 提示符)

c++ - 我该如何使用带有 vector 和共享指针的派生类?

c++ - 使用 for_each 和 bind 反转 vector 中的字符串

c++ - C++ 中的模板类和函数重载

c++ - rapidjson:从文件中读取文档的工作代码?

两个派生类的 C++ 拷贝