混合模板/非模板继承分类法和成员继承
Mixed template / non-template inheritance taxonomy and member inheritance
下面是一个简单的 class 层次结构,混合了模板化和非模板化 classes。嵌入在这个例子的注释中的是我正在尝试修复的编译错误。
我在 SO 上阅读了其他一些相关主题,并尝试了几种形式的 "using" 关键字但无济于事。
我在这些试验中了解到:
Parent::parent_ivar_ = 99;
是可行的语法,但不知道如何告诉编译器我想在子 class.
中 set/use 继承的 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
需要访问 GrandParent
那么您将需要更改继承级别,或者在 Parent
上提供一个方法(其中 Child
可以看到)可以用来改变grandparent_ivar_
这里实际上有两个个问题。
第一个问题是,正如在另一个答案中指出的那样,Parent
必须公开继承自 GrandParent
。
但这不是唯一的问题。即使有了这个修复,这也将无法编译。直到 Child
的构造函数更改为:
Child() {
this->grandparent_ivar_ = 100;
}
这是一个涉及模板的相当微妙的解析问题。在模板被完全解析之前,编译器本身没有足够的信息来知道 grandparent_ivar_
到底是什么。它没有在模板 class 中声明。这不是之前声明的一些全局变量。
在模板被完全解析之前,编译器真的无法查看它的超classes,看看那里有什么。也许这就是 grandparent_ivar_
所在的位置。也许不吧。谁知道呢
这是一个粗略的、基本的、胶囊式的总结。它的具体细节是,在声明模板时,您需要给编译器更多的松弛,并且更明确一些。有几种方法可以做到这一点,但最简单的方法是更加自由,并明确地说 "this->foo",以便使用一些最终可能从模板的 super[ 中提取的 foo
=34=].
下面是一个简单的 class 层次结构,混合了模板化和非模板化 classes。嵌入在这个例子的注释中的是我正在尝试修复的编译错误。
我在 SO 上阅读了其他一些相关主题,并尝试了几种形式的 "using" 关键字但无济于事。
我在这些试验中了解到: Parent::parent_ivar_ = 99; 是可行的语法,但不知道如何告诉编译器我想在子 class.
中 set/use 继承的 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
需要访问 GrandParent
那么您将需要更改继承级别,或者在 Parent
上提供一个方法(其中 Child
可以看到)可以用来改变grandparent_ivar_
这里实际上有两个个问题。
第一个问题是,正如在另一个答案中指出的那样,Parent
必须公开继承自 GrandParent
。
但这不是唯一的问题。即使有了这个修复,这也将无法编译。直到 Child
的构造函数更改为:
Child() {
this->grandparent_ivar_ = 100;
}
这是一个涉及模板的相当微妙的解析问题。在模板被完全解析之前,编译器本身没有足够的信息来知道 grandparent_ivar_
到底是什么。它没有在模板 class 中声明。这不是之前声明的一些全局变量。
在模板被完全解析之前,编译器真的无法查看它的超classes,看看那里有什么。也许这就是 grandparent_ivar_
所在的位置。也许不吧。谁知道呢
这是一个粗略的、基本的、胶囊式的总结。它的具体细节是,在声明模板时,您需要给编译器更多的松弛,并且更明确一些。有几种方法可以做到这一点,但最简单的方法是更加自由,并明确地说 "this->foo",以便使用一些最终可能从模板的 super[ 中提取的 foo
=34=].