是否可以从模板基类继承,但不能使派生类成为模板?

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()'.我得到了构造函数和解构函数

Whi*_*TiM 7

是的,这是完全可能的,但您可能想要保留基类型的别名.

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)

其次,在模板实例化期间,所有定义必须对编译器可见.您不能真正拥有模板的常规单独标头和实现文件,您可以使用一些额外的技术.请参阅为什么模板只能在头文件中实现