使用基本模板标识符时继承
Inherit while using base template identifiers
我有两个模板 A 和 B,它们都具有相同的模板类型。A 始终从 B 继承,但它始终为 B 选择与 A 本身相同的模板。
这本身很好,但这需要我编写两次模板类型。是否可以以某种方式对 A 中的类型进行类型定义,并在从子类继承时引用泛型 typedef 名称?
下面是一些无法编译的示例代码,但应该清楚地了解我想做什么:
// #1
template <typename T>
struct A
{
typename T type;
// class details here
};
// #2
template <typename T>
struct B
{
// class details here
};
// #3
template <>
struct A<int>
: B<type> // Compiler complains here (type not defined)
//: B<A::type> // Compiler complains here (type not defined)
// I could write ": B<int>" instead, but this is repitition I want to avoid
{
// class specialization details here
};
我愿意接受替代解决方案。这对我来说很重要的原因是我有大量的代码列表,例如 #3 的代码,我想减少重复(以避免错误(。
同一模板的两个不同专用化是完全不相关的类型*,因此您不能在专用化A<int>
中使用基本模板中的A<>::type
。即使您在A<int>
专用化中定义了type
,在定义类之前,它也不会可用,这发生在继承列表之后。
你可以而且应该在那里使用: B<int>
。它不比B<type>
更多的重复,并明确指出A<int>
继承自B<int>
,如果您通过间接,则不会立即看到。
你的设计让我烦恼的另一件事是A<>
(通用的(与B<>
没有任何关系,但A<int>
继承自B<int>
。虽然该语言允许在专业化中完全不相关的行为,但这可能会让其他程序员感到惊讶,因为他们可以将A<T>
的对象传递给某些T
B<T>
函数,但对其他则不然......
您想要解决的实际问题是什么?
* 这意味着专用化不提供特殊行为(即仅提供与基本不同的位(,而是提供该类型的所有行为。如果您只想覆盖部分行为,则应考虑其他替代方法,例如将A<T>
(泛型(重构为基础,以便A<int>
(或其他专用化(可以借用实现。或者,如果行为变化很小,您可能只能专门化一些成员函数......
相关文章:
- 继承函数的重载解析
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- #ifdef和未声明的标识符
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 具有继承的未声明标识符(运算符 ostream)
- 在模板和继承C++中使用未声明的标识符
- C++继承/未声明的标识符问题
- 使用基本模板标识符时继承
- c++类继承,标识符未定义
- 将未声明的标识符与模板和继承跟进一起使用