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

Is it possible to inherit from a template base class but not to make the derived class a template as well?

本文关键字:派生 但不能 继承 基类 是否      更新时间:2023-10-16

我试图从模板基类继承,但我得到了几个错误,因为我的派生类不是模板类。我也不希望这样,我只想共享一些变量并让派生类实现它们。

//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*>();
}

因此,例如,我想从基类实现此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;
};

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

模板类声明和实现可以拆分为单独的文件,但必须在使用模板的位置包含两者。

并且基本模板实现中存在语法错误:

//base.h
template <typename T>
class Base
{
public:
     explicit Base(QWidget *parent);
    ~Base();
protected:
    QList<T*>* list;
    T* selectedObject;
};
//base.hpp
#include "base.h"
template <typename T>
Base<T>::Base(QWidget* parent)
{
}
template <typename T>
Base<T>::~Base()
{
}

//derived.h
namespace Ui
{
    class Derived;
}
#include "base.h"
class Derived: public QWidget, public Base<MyType>
{
    Q_OBJECT
public:
    explicit Derived(QWidget *parent = 0);
    ~Derived();
private:
    Ui::Derived*ui;
};
//derived.cpp
#include "base.hpp"
Derived::Dervied(QWidget* parent) : QWidget(parent), Base<Mytype>()
{
    list = new QList<MyType*>();
}

并且不要忘记使用一次 #pragma 或保护定义

相关文章: