0

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

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

4

1 回答 1

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>为 some T,但不能为其他...

您想要解决的实际问题是什么?


*这意味着特化提供特殊行为(即仅与基础不同的位),而是提供该类型的所有行为。如果您只想覆盖部分行为,则应考虑其他替代方案,例如将A<T>(泛型)重构为基础,以便A<int>(或其他专业化)可以借用实现。或者,如果行为的变化很小,您也许可以专门化一些成员函数......

于 2013-08-13T20:04:11.590 回答