我有两个模板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<>::type
内部的基础模板中使用A<int>
。即使您在type
专门化内定义了A<int>
,也要等到定义了类后才能使用它,该类在继承列表之后发生。
您可以并且应该在其中使用: B<int>
。它重复的次数不超过B<type>
,并且清楚地表明A<int>
是从B<int>
继承的,如果您通过间接调用,这种情况不会立即可见。
从您的设计中发现的另一件事是A<>
(通用名称)与B<>
没有任何关系,但是A<int>
继承自B<int>
。尽管该语言允许专业化中完全不相关的行为,但对于其他程序员而言,当他们可以将A<T>
的对象传递给某些B<T>
接受T
的函数时,可能会感到惊讶...
您要解决的实际问题是什么?
*这意味着特殊化不会提供特殊的行为(即仅提供与基数不同的位),而是提供该类型的所有行为。如果仅打算覆盖部分行为,则应考虑其他替代方法,例如将A<T>
(泛型)重构为基数,以便A<int>
(或其他专业化)可以借用该实现。或者如果行为的变化很小,您也许可以专门化某些成员函数...
关于c++ - 使用基本模板标识符时继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18217820/