这似乎有效,但我不是百分之百确定这是合法的,并会感谢一些反馈。
我有一个派生自通用基类的子类。它类似于奇怪的重复模板模式,但不同。
在derived.h中:
template <class T>
class Derived : public T
{
public:
Derived();
... and some other stuff ...
};
在derived.cpp中:
#include "derived.h"
template <class T>
Derived<T>::Derived()
{
...
}
// defining the variations I need here avoids linker errors
// see http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13
template Derived<Base1>::Derived();
template Derived<Base2>::Derived();
在其他文件中:
#include "derived.h"
void test()
{
Derived<Base1> d1;
Derived<Base2> d2;
... do stuff with d1 and d2 ...
}
答案 0 :(得分:5)
是的,你可以从任何类派生,包括一个(或依赖于)模板参数的类。
如评论中所述,它必须是完整的类型;也就是说,它必须在模板实例化之前定义。
答案 1 :(得分:5)
在C ++中没有“泛型类”这样的东西。您拥有的是模板,模板不是类。相反,模板的实例成为类。但是,这些是完全不同的,独立的和不相关的类,因此Derived<A>
和Derived<B>
彼此无关。
除此之外,你所做的一切都很好。在任何给定的模板实例 Derived<T>
中,T
是一个实际的类(假设它 实际上是一个类,而不是一个数组或者int
),你可以从中得到它。