【问题标题】:Simple template inheritance issue C++简单的模板继承问题 C++
【发布时间】:2011-02-10 06:25:50
【问题描述】:
template <class T>
class baseclass{
protected:
    T data;
public:
    baseclass(){};
    void setData(T d);
};

template<class T>
void baseclass<T>::setT(T d){
    data = d;
}

上面显示的是我的基类,一个受保护的成员变量,一个 setter。

template <class T>
class aclass : public baseclass<T>
{
    public:
        aclass(T d);
};

template<class T>
aclass<T>::aclass(T d){
     setData(d); <---WORKS
     data = d;   <---DOESN'T WORK
}

现在这是我的第一个子类。出于某种原因,直接访问受保护的成员变量是行不通的,尽管我认为它应该这样做。但是,访问设置器工作正常。我是 C++ 的菜鸟,我确定我遗漏了一些明显的东西。

【问题讨论】:

  • 这样写行不行->data = d;?
  • 您能否更具体地说明“不起作用”是什么意思?您是否收到编译器错误(如果是,是哪一个),或者它在运行时什么也不做?
  • @Michael 是的,确实如此。自然。

标签: c++ templates inheritance


【解决方案1】:

这不起作用的原因是 C++ 模板进行名称​​解析的方式有一个怪癖。特别是,如果您有一个模板类继承自另一个依赖于模板类型的类(正如您在本例中所做的那样),则您无法直接访问该基类的成员,而无需向编译器提示在哪里看。这是您遇到错误的原因。

要解决这个问题,您可以将构造函数重写为

template<class T>
aclass<T>::aclass(T d){
     setData(d);
     this->data = d;
}

既然编译器知道data 一定是aclass&lt;T&gt; 的成员,它就可以找到它要查找的内容。

有趣的是,出于同样的原因,您也应该在上一行中收到错误。我不确定它为什么决定编译。要解决此问题,您可以这样做:

template<class T>
aclass<T>::aclass(T d){
     this->setData(d);
     this->data = d;
}

或者,您可以添加using 声明以告诉编译器aclass 从其父类继承setData 方法。在类声明中,考虑添加这一行:

template <class T>
class aclass : public baseclass<T>
{
    public:
        aclass(T d);

        using baseclass<T>::setData;
};

就像数据成员的 this-&gt; 一样,这个技巧可以明确名称 setData 的来源,并帮助编译器知道你在说什么。

希望这会有所帮助!

【讨论】:

  • setData(d) 有效,因为 d 依赖于模板参数。因此,直到 T 已知才解决。那时我们也知道实际的基类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多