C++ Qt类型作为函数的参数

C++ Qt类型作为函数的参数,c++,qt,templates,types,qt4,C++,Qt,Templates,Types,Qt4,我正在尝试构建一个函数,该函数将(qt)类型作为参数,并使用它来查找子对象。我的函数如下所示: template <typename QType> void MyClass::activateElements(QWidget *widget, QType t) { QList<QType *> buttons = widget->findChildren(t); foreach( QType *button, buttons ) {

我正在尝试构建一个函数,该函数将(qt)类型作为参数,并使用它来查找子对象。我的函数如下所示:

template <typename QType>
void MyClass::activateElements(QWidget *widget, QType t)
{
    QList<QType *> buttons = widget->findChildren(t);
    foreach( QType *button, buttons )
    {
        buttons->setEnabled(true);
    }
}
    QDoubleSpinBox x;
    object_of_my_class->activateElements(correctWidget, x);
此时,由于出现以下错误,我陷入困境:

错误:“QDoubleSpinBox::QDoubleSpinBox(const QDoubleSpinBox&)”是私有的
Q\u禁用复制(QDoubleSpinBox)


QDoubleSpinBox和其他都是私有的,我该如何处理这个问题?我有没有尝试过如何构建错误的函数,或者我只是在错误地使用它?有没有办法做到这一点?

看起来您根本不需要该类型的对象,只需要该类型本身。在这种情况下,指定模板参数将是一种方法:

template <typename QType>
void MyClass::activateElements(QWidget *widget)
{
    QList<QType *> buttons = (* widget).findChildren<QType *>();
    foreach( QType *button, buttons )
    {
        button->setEnabled(true);
    }
}

// Usage:
object_of_my_class->activateElements<QDoubleSpinBox>(correctWidget);
模板
void MyClass::activateElements(QWidget*widget)
{
QList按钮=(*widget).findChildren();
foreach(QType*按钮,按钮)
{
按钮->设置启用(真);
}
}
//用法:
我的类的对象->激活元素(correctWidget);
我会这样做,因为它很好地表达了我的意图

但是,如果确实要从现有对象启用类型推断,请通过引用传递它以避免(禁止)复制:

模板
void MyClass::activateElements(QWidget*小部件,常量QType&)
{
QList按钮=(*widget).findChildren();
foreach(QType*按钮,按钮)
{
按钮->设置启用(真);
}
}
//用法:
QDoubleSpinBox x;
我的类的对象->激活元素(correctWidget,x);

“如果QDoubleSpinBox和其他都是私有的,我该如何处理这个问题?”错误指出,
QDoubleSpinBox的复制构造函数是私有的(即,它不能被复制)。按引用传递,而不是按值传递。非常感谢!第一种方法似乎确实是更好的选择。我之前在那里,但一定是把函数调用搞砸了,然后迷路了。再次使用它,我得到了“对
void MyClass::activateeelements(QWidget*)
的未定义引用。我在头文件中将它定义为
template void activateeelements(QWidget*widget);
。这是我的错误吗?@Shin您在那里定义了它(包括主体),还是在那里声明了它(并将其实现放在
.cpp
文件中)?只有前者可以工作:请看。我不知道函数也必须在
标题中定义。这样做了,现在终于可以工作了。非常感谢您的帮助:)@Shin非常清楚:函数不必定义,函数模板可以。
template <typename QType>
void MyClass::activateElements(QWidget *widget)
{
    QList<QType *> buttons = (* widget).findChildren<QType *>();
    foreach( QType *button, buttons )
    {
        button->setEnabled(true);
    }
}

// Usage:
object_of_my_class->activateElements<QDoubleSpinBox>(correctWidget);
template <typename QType>
void MyClass::activateElements(QWidget *widget, const QType &)
{
    QList<QType *> buttons = (* widget).findChildren<QType *>();
    foreach( QType *button, buttons )
    {
        button->setEnabled(true);
    }
}

// Usage:
QDoubleSpinBox x;
object_of_my_class->activateElements(correctWidget, x);