混合模板/非模板继承分类和成员继承
Mixed template / non-template inheritance taxonomy and member inheritance
下面是一个简单的类层次结构,混合了模板化和非模板化类。 此示例的注释中嵌入了一个我正在尝试修复的编译错误。
我已经在SO上阅读了其他一些相关线程,并尝试了几种形式的"using"关键字,但无济于事。
在这些试验中,我了解到: 父级::p arent_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;
}
这里其实有两个问题。
第一个问题是,正如在另一个答案中指出的那样,Parent
必须公开继承GrandParent
。
但这不是唯一的问题。即使有该修复,这也将无法编译。直到Child
的构造函数改为:
Child() {
this->grandparent_ivar_ = 100;
}
这是一个涉及模板的相当微妙的解析问题。在模板被完全解析之前,编译器没有足够的信息来知道到底是什么grandparent_ivar_
,本身。它未在模板类中声明。它不是之前声明的某个全局变量。
在模板被完全解析之前,编译器真的无法查看其超类,以查看其中的内容。也许这就是grandparent_ivar_
所在的地方,也许。也许不是。谁知道呢。
这是一个粗略的、基本的、胶囊式的总结。它的具体细节是,在声明模板时,您需要给编译器更多的松弛,并且更明确一点。有几种方法可以做到这一点,但最简单的方法是更自由,并明确地说"this->foo",以便使用一些最终可能从模板的超类中提取的foo
。
你的问题是Parent
私下继承GrandParent
,因此Child
看不到它。
如果Child
需要访问GrandParent
则需要更改继承级别,或在Parent
上提供可用于更改grandparent_ivar_
的方法(Child
可以看到)
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 派生类调用使用非继承成员的继承函数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C :原始成员与继承成员的优先级
- 更改继承成员的地址
- C 是否可以不继承成员
- 使用模板的继承阴影继承成员
- 继承成员功能的模板专业化
- 不允许继承成员,为什么
- 派生模板类和继承成员变量的语法谜题
- 继承成员地址的C++标准
- 多级继承成员访问
- 访问专用模板的私有/继承成员变量
- 基模板继承成员,减少所需的类型
- 继承成员函数指针
- 模板专用化类不继承成员
- C++14正在初始化类构造函数初始化列表中的继承成员
- 具有专门初始化的继承成员变量
- 模板继承成员字段
- 访问数据成员的继承成员函数