2017-12-29 47 views
1

(qt) Type을 매개 변수로 사용하고이를 사용하여 자식을 찾는 함수를 작성하려고합니다. 내 기능은 다음과 같습니다 : 나는 또한 내가 다른 클래스에서이 함수를 사용하는 클래스의 객체를 인스턴스화 함수의 매개 변수로 Qt 형식

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

을 시도

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

. 이 나는이처럼 사용하려고 :

error: ‘QDoubleSpinBox::QDoubleSpinBox(const QDoubleSpinBox&)’ is private Q_DISABLE_COPY(QDoubleSpinBox)

내가 QDoubleSpinBox 다른 사람이라는 것을,이 문제를 처리 할 방법 : 나는 다음과 같은 오류가 있기 때문에이 시점에서

QDoubleSpinBox x; 
    object_of_my_class->activateElements(correctWidget, x); 

내가 박히 은밀한? 함수를 잘못 작성하는 방법에 접근 했습니까? 아니면 잘못 사용하고 있습니까? 그것을 할 수있는 방법이 있습니까?

+0

"나는이 문제를 처리 할 것 _How, 그 QDoubleSpinBox : 그러나, 당신이 정말로은 기존 개체의 형태 추론을 사용하려면 경우

는 (금지) 복사를 방지하기 위해 참조하여 통과 _ ""QDoubleSpinBox의 ** copy-constructor **은 private입니다 (즉, 복사 할 수 없습니다). 값으로 전달하는 대신 참조로 전달하십시오. –

답변

2

유형의 객체가 전혀 필요하지 않은 것처럼 보입니다. 유형 자체 만 필요합니다. 이러한 경우, 템플릿 인수를 지정하면 갈 수있는 방법이 될 것입니다 :

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); 
+0

이미 고마워! 실제로 첫 번째 접근법이 더 나은 선택 인 것으로 보인다. 이전에 거기에 있었지만 함수 호출을 엉망으로 만든 다음 잃어 버렸을 것입니다. 다시 "void MyClass :: activateElements (QWidget *)'에 대한 정의되지 않은 참조를 얻습니다.이 템플릿을'template 템플릿으로 정의했습니다. void activateElements (QWidget * widget);' – Shin

+0

@Shin 몸체를 포함하여 * 정의했는지 (또는 몸체 포함) * 선언했는지 (구현체를'.cpp' 파일에 넣었습니까?) 오직 이전의 것들만 사용할 수 있습니다 : [템플릿을 헤더 파일에만 구현할 수있는 이유는 무엇입니까?] (https://stackoverflow.com/q/495021/1782465) – Angew

+0

이 함수는'header' 거짓말에 정의되어야한다는 것을 몰랐습니다. 그것과 그것은 마침내 모두 작동합니다. 당신의 도움을 많이 주셔서 감사합니다 :) – Shin

관련 문제