我正在尝试做一些简单的事情:用泛型创建一个实例。我收到一条错误消息,说我无法创建实例,因为我没有#include "hidabletabwidget.h"
#include <QTabBar>
#include <QToolButton>
HidableTabWidget::HidableTabWidget(QWidget *parent) :
QTabWidget(parent),
hideAction("▾", this)
{
hideAction.setCheckable(true);
hideAction.setToolTip("Hide Panels");
QToolButton* hideButton = new QToolButton();
hideButton->setDefaultAction(&hideAction);
hideButton->setAutoRaise(true);
this->setCornerWidget(hideButton);
connect(&hideAction, SIGNAL(toggled(bool)), this, SLOT(onHideAction(bool)));
connect(this, SIGNAL(tabBarClicked(int)), this, SLOT(onTabBarClicked()));
}
void HidableTabWidget::onHideAction(bool checked)
{
if (checked)
{
this->setMaximumHeight(this->tabBar()->height());
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
}
else
{
this->setMaximumHeight(100000); // just a very big number
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
}
}
void HidableTabWidget::onTabBarClicked()
{
hideAction.setChecked(false);
}
约束。但是,我在退货声明中确实有这个!有什么想法吗?
new
答案 0 :(得分:5)
您必须在new()
类型参数上指定TA
约束才能调用构造函数:
public IAction CreateAction<TA, TP>(ActionParamBase param)
where TA : IAction
, new()
where TP : ActionParamBase
{
...
}
只有这样才能知道(并强制)TA
具有无参数构造函数。
(只是一个小小的注释:它只适用于无参数构造函数,而不适用于具有参数的构造函数。在这种情况下,您可以使用初始化函数)
答案 1 :(得分:3)
这意味着在你的TA部分约束中有new
。请参阅此SO帖子以供参考,然后查看以下代码:
Passing arguments to C# generic new() of templated type
public IAction CreateAction<TA, TP>(ActionParamBase param)
where TA : IAction, new()
where TP : ActionParamBase
{
Ensure.That(param).Is<TP>();
return new TA { Param = param as TP };
}