是否可以从模板基类继承,但不能使派生类也成为模板
Is it possible to inherit from a template base class but not to make the derived class a template as well?
我试图从模板基类继承,但我得到了几个错误,因为我的派生类不是模板类。我也不希望这样,我只想共享一些变量并让派生类实现它们。
//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 或保护定义
相关文章:
- 是否可以将函数导入命名空间,但不能导出它?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- C++:返回本地对象,但不能正常工作
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 用C++替换std::字符串中的一个子字符串,但不能全部替换
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 我可以在Windows(Visual C++)中读取bin文件,但不能在linux(GCC)上读取bin文件
- 继承比较运算符,但不能将派生类彼此进行比较
- 是否可以从模板基类继承,但不能使派生类也成为模板
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么