Gre*_*ish 0 c++ inheritance templates
我试图从模板基类继承但是我得到了几个错误,因为我的派生类不是模板类.我也不希望它,我只是想分享一些变量,让派生类实现它们.
//base.h
template <typename T>
class Base
{
public:
explicit Base(QWidget *parent);
~Base();
protected:
QList<T*>* list;
T* selectedObject;
};
//base.cpp
#include "base.h"
template <typename T>
Base<T>::Base(QWidget* parent)
{
}
template <typename T>
Base<T>::~Base()
{
}
//derived.h
namespace Ui
{
class Derived;
}
class Derived: public QWidget, public Base<MyType>
{
Q_OBJECT
public:
explicit Derived(QWidget *parent = 0);
~Derived();
private:
Ui::Derived*ui;
};
//derived.cpp
Derived::Dervied(QWidget* parent) : QWidget(parent), Base<Mytype>(parent)
{
list = new QList<MyType*>();
}
Run Code Online (Sandbox Code Playgroud)
所以我想要从基类实现这个Qlist,但是使用像MyType这样的特定类型参数.我之前在c ++中没有使用模板与继承相结合,我尝试了几件事,但是他们没有成功.
编辑 所以,我尝试下面解释dtbeaver,但后来我得到以下错误信息:未定义引用'Base :: Base()'.我得到了构造函数和解构函数
是的,这是完全可能的,但您可能想要保留基类型的别名.
例
class Derived: public QWidget, public Base<MyType>
{
Q_OBJECT
public:
using BaseType = Base<Mytype>; //alias, will be useful someday
explicit Derived(QWidget *parent = 0);
~Derived();
private:
Ui::Derived*ui;
};
Run Code Online (Sandbox Code Playgroud)
其次,在模板实例化期间,所有定义必须对编译器可见.您不能真正拥有模板的常规单独标头和实现文件,您可以使用一些额外的技术.请参阅为什么模板只能在头文件中实现