假设模板化基类:
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
。
答案 0 :(得分:4)
只需使用一个小帮助命名空间:
namespace ChildClassNamespace {
typedef MyVeryVeryComplicatedType LocalType;
class ChildClass : public BaseClass<LocalType> { /* ... */ };
}
using ChildClassNamespace::ChildClass;
答案 1 :(得分:3)
没有。将typedef
放在封闭的命名空间中。
这最有意义无论如何,因为你在两个名称空间的类型(ChildClass
和BaseClass<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
};