【发布时间】:2018-07-31 17:38:34
【问题描述】:
我想从类模板继承,但是将继承类的成员类作为模板参数传递给基类。这甚至可能吗?这是一个最小的例子。
template<typename T>
class Base { /* stuff involving T */ };
template <typename U>
class Derived : Base<typename Derived<U>::Member> {
public:
class Member { /* stuff involving U */};
/* stuff involving Member, Base<Member> and U */
};
在我尝试创建Derived 的实例(例如Derived<int>)之前编译良好,此时 g++ (7.2.0) 告诉我我正在使用不完整的类型。
In instantiation of ‘class Derived<int>’:
error: invalid use of incomplete type ‘class Derived<int>’
class Derived : Base<typename Derived<U>::Member> {
^~~~~~~
我可以看出问题所在:Base 的实例化需要 Derived::Member 的知识,这尚未定义,但有什么办法可以解决这个问题?
作为替代方案,我可以在Derived 之外拥有Member,但是我失去了将其作为成员类的优势(访问Derived 的私有和受保护成员,Member 的封装等...)。我也考虑过让Member 成为Base 的成员,但从逻辑上讲,Member 的内容特定于Derived,不属于更一般的Base。
【问题讨论】:
-
Member的定义是什么?T如何在Base中使用(是否有一些T值)? -
是的,需要有一个 T 值并调用 T 的成员函数。
标签: c++ templates inheritance