Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 混合模板/非模板继承分类法和成员继承_C++_Templates_Inheritance_Mixed - Fatal编程技术网

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

C++ 混合模板/非模板继承分类法和成员继承,c++,templates,inheritance,mixed,C++,Templates,Inheritance,Mixed,下面是一个简单的类层次结构,它混合了模板化类和非模板化类。在这个例子的注释中嵌入了一个编译错误,我正试图修复这个错误 我在这里读了一些其他相关的文章,并尝试了几种使用关键字的形式,但都并没有用 我在这些试验中了解到: Parent::Parent\u ivar\u99; 是可行的语法,但不知道如何告诉编译器我希望在子类中设置/使用的继承的ivar祖父母 提前谢谢 class GrandParent { public: int grandparent_ivar_; }; template

下面是一个简单的类层次结构,它混合了模板化类和非模板化类。在这个例子的注释中嵌入了一个编译错误,我正试图修复这个错误

我在这里读了一些其他相关的文章,并尝试了几种使用关键字的形式,但都并没有用

我在这些试验中了解到: Parent::Parent\u ivar\u99; 是可行的语法,但不知道如何告诉编译器我希望在子类中设置/使用的继承的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;
}
你们的问题是父母私下继承祖父母,所以孩子看不见

如果孩子需要访问祖父母,那么您需要更改继承级别,或者提供一个孩子可以看到的用于更改祖父母的方法。这里实际上有两个问题

第一个问题是,正如另一个答案所指出的,父母必须公开继承祖父母的遗产

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

Child() {
    this->grandparent_ivar_ = 100;
  }
这是一个涉及模板的相当微妙的解析问题。在完全解析模板之前,编译器本身没有足够的信息来知道什么是祖父母。它没有在模板类中声明。它不是以前声明过的某个全局变量

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


这是一个粗略的、基本的总结。关键在于,在声明模板时,您需要让编译器稍微放松一点,并且更加明确一点。有几种方法可以做到这一点,但最简单的方法是更加自由,明确地说这个->foo,以便使用一些最终可能从模板超类中拉入的foo。

感谢Sam提供的大量信息。是的,我错过了示例中的公共继承。我修正了这个问题,因为它与问题无关。我将研究this->foo解决方案。经过进一步的调查,使用祖父母::祖父母_ivar;放置在子类声明中也起作用。干杯。是的,很抱歉。我不打算私下继承祖父母的遗产。在我最初的例子中,这是一个疏忽。我修正了这个例子以保留我问题的焦点。