我可以使用类级别typedef作为基类的模板参数吗?

时间:2014-05-02 13:57:05

标签: c++ templates inheritance typedef

假设模板化基类:

template<typename T>class BaseClass;

在其他类中我想继承这个,T是一个相当复杂的类型,所以我想使用typedef。因为我不想污染命名空间,所以我希望在类定义中包含typedef

class ChildClass : public BaseClass<MyVeryVeryVeryComplicatedType> {
  typedef MyVeryVeryComplicatedType LocalType;
  ...
}

现在我当然还不能使用LocalType作为BaseClass的模板参数,并且必须编写两次复杂的定义(MyVeryVeryComplicatedType)。 (所以标题问题的答案是“不,我猜。”

问题:有没有办法只定义一次定义,但仍然只在类中定义(或以限制LocalType范围的类似方式)?

注意:我考虑过使用宏,但注意到结果与在类定义之前使用typedef的结果相同(甚至更糟)。

编辑:为了澄清:我有一个基类,因为我想要有几个不同的子项,它们共享一些功能。共享部分只需知道某些类型T。由于子类中使用的类型的细节与共享功能无关,我认为基类不应该知道这些细节(实际上,我必须将大量#include语句放入能够为所有子类定义typedef的基类。每个子类都有一个相当不同的MyVeryVeryVeryComplicatedType

3 个答案:

答案 0 :(得分:4)

只需使用一个小帮助命名空间:

namespace ChildClassNamespace {
    typedef MyVeryVeryComplicatedType LocalType;
    class ChildClass : public BaseClass<LocalType> { /* ... */ };
}
using ChildClassNamespace::ChildClass;

答案 1 :(得分:3)

没有。将typedef放在封闭的命名空间中。

这最有意义无论如何,因为你在两个名称空间的类型(ChildClassBaseClass<LocalType>)中使用它。

答案 2 :(得分:3)

您可以在基类中定义它:

template <typename T> class BaseClass {
protected:
    typedef T LocalType;

    // whatever else
};

class ChildClass : public BaseClass<MyVeryVeryVeryComplicatedType> {
    // LocalType is usable here, and aliases MyVeryVeryVeryComplicatedType
};