使用基本模板标识符时继承

时间:2013-08-13 19:42:50

标签: c++ templates inheritance

我有两个模板A和B都具有相同的模板类型。总是,A继承自B,但它总是选择与A本身使用的B相同的模板。

这本身很好,但这需要我两次编写模板类型。是否有可能以某种方式在A中键入dede类型并在从子类继承时引用泛型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那样的大量代码清单,我希望减少重复(以避免错误)。

1 个答案:

答案 0 :(得分:1)

同一模板的两个不同特化是完全不相关的类型 * ,因此您无法使用专业化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>(或其他特化)可以借用实现。或者,如果行为的变化很小,您可能只需要专门化一些成员函数......