【问题标题】:C++ inheritance of template objects (G++ compiler)模板对象的 C++ 继承(G++ 编译器)
【发布时间】:2013-05-29 14:36:54
【问题描述】:
#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: 错误:“数据”未在此范围内声明

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

【问题讨论】:

标签: c++ templates inheritance


【解决方案1】:

问题出在CThirdLevel。无法从 CSecondLevel 解析字段 data。你可以通过改变来解决这个问题

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

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

【讨论】:

  • this-&gt;data.push_back(_value);
  • 原因是 C++ 的“两阶段名称查找”,其中模板中的名称要么依赖要么不依赖(依赖于模板参数)。您需要 data 被归类为依赖,但没有 this-&gt;CSecondLevel&lt;A&gt;:: 它被归类为非依赖。请注意,并非所有编译器都能正确进行两阶段查找;尤其是 VC++ 以松散着称。
【解决方案2】:

按照 Marc 的建议,使用

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

或者,你可以这样做

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2018-11-11
    • 2011-12-20
    • 2011-02-28
    相关资源
    最近更新 更多