混合模板/非模板继承分类和成员继承

时间:2016-02-20 00:45:32

标签: c++ templates inheritance mixed

下面是一个简单的类层次结构,包含模板化和非模板化类。嵌入在此示例的注释中的是我正在尝试修复的编译错误。

我已经在SO上阅读了一些其他相关的主题,并尝试了几种形式的“使用”关键字无济于事。

我在这些试验中了解到:     Parent :: parent_ivar_ = 99; 是可行的语法,但不知道如何告诉编译器我想在Child类中设置/使用的继承的ivar grandparent_ivar_。

提前致谢!

class GrandParent {
 public:
  int grandparent_ivar_;
};

template <typename T>
class Parent : public GrandParent {
 public:
  int parent_ivar_;
};

template <typename T>
class Child : public Parent<T> {
 public:
  Child() {
    // The following stmt produces this compiler error using ubuntu g++:
    //   templateinheritance.cpp: In constructor ‘Child<T>::Child()’:
    //   templateinheritance.cpp:20:5: error: ‘grandparent_ivar_’ was
    //   not declared in this scope
    //        grandparent_ivar_ = 100;
    //  
    grandparent_ivar_ = 100;
  }
};

int main(int argc, char *argv[]) {
  Child<int> c;
}

2 个答案:

答案 0 :(得分:3)

这里确实存在两个问题。

第一个问题是,正如另一个答案所述,Parent必须公开继承GrandParent

但这不是唯一的问题。即使有了这个修复,这也无法编译。直到Child的构造函数更改为:

Child() {
    this->grandparent_ivar_ = 100;
  }

这是一个涉及模板的相当细微的解析问题。在模板被完全解析之前,编译器本身没有足够的信息来知道它是什么grandparent_ivar_。它没有在模板类中声明。它不是先前声明的一些全局变量。

在完全解析模板之前,编译器实际上无法查看其超类,以查看其中的内容。也许这就是grandparent_ivar_所在的地方。也许不吧。谁知道呢。

这是一个粗略的,基本的,胶囊摘要。它的坚果和螺栓是,在声明模板时,你需要给编译器一点松弛,并且更加明确。有几种方法可以做到这一点,但最简单的方法是更自由,并明确说“this-&gt; foo ”,以便使用一些foo可能最终从模板的超类中拉进来。

答案 1 :(得分:0)

您的问题是Parent私下继承GrandParent,因此Child无法看到它。

如果Child需要访问GrandParent,那么您需要更改继承级别,或者在Parent上提供方法(Child 可以 see)可用于更改grandparent_ivar_