2016-08-10 10 views
1

Qt 프로젝트에서 작업 중이며 QLabel 멤버 함수 및 해당 매개 변수에 대한 포인터를 사용하는 함수를 구현하여 일부 레이블에 적용하는 것으로 결정했습니다.함수 멤버 포인터를 함수의 매개 변수로 전달

applyToLabels (&QLabel::setStyleSheet, "color:red;"); 

그것은 말한다 :

가 오류 : 통화에 대해 일치하는 멤버 함수에 'applyToLabels'

후보 템플릿은 무시

template <class R, class ...Args> 
void ClockSim::applyToLabels (R (QLabel::*f)(Args...), Args&& ...args) 
{ 
    ui->labelSingleTime->*f (std::forward<Args>(args)...); 
    //Repeat it for many other labels 

} 

나는 그것을 호출하는 시도 : 'QWidget'과 'QLabel'을 일치시킬 수 없습니다.

모든 솔루션? setStylesSheet 이후 감사

+0

왜 'QWidget'오류가 발생 했습니까? 전체 예제가 표시되지 않는 이유는 무엇입니까? – Arunmu

+0

ClockSim은 QWidget의 파생 클래스입니다. –

+0

또한'char const (&) [10]'형식의 인수를 전달합니다. 만약 당신의 멤버 함수가'const char *'를 기대한다면 이것은 작동하지 않을 것입니다 (아마도 약간의 모호함이있을 것입니다). – Arunmu

답변

5

QWidget의 상속 회원, &QLabel::setStylesSheet의 유형이 실제로 void (QWidget::*)(const QString&)입니다, 그것은 당신의 템플릿 함수 매개 변수와 일치하지 않습니다.

당신은 멤버 함수의 실제 클래스에 대한 다른 템플릿 매개 변수를 사용해야합니다 : 당신이 전달하려고하기 때문에 나는 또한 당신의 통과 인수는 다른 함수 포인터를 매개 변수를했습니다

template <class R, class C, class ...Params, class ...Args> 
typename std::enable_if<std::is_base_of<C,QLabel>::value && 
         sizeof...(Params)==sizeof...(Args)>::type 
ClockSim::applyToLabels (R (C::*f)(Params...), Args&& ...args) 
{ 
    (ui->labelSingleTime->*f)(std::forward<Args>(args)...); 
} 

const char(&)[11]QString이 아니지만 1로 변환됩니다.

+0

환상적입니다. 설명에 많은 감사드립니다. –

+1

니스, 나는 답변을 게시하려고했으나 광산과 비슷하게 보입니다. 여기에 몇 가지 테스트 소스 코드가 있습니다. http://coliru.stacked-crooked.com/a/d64862509212d127 – marcinj

+0

암시 적으로 변환 할 수있는 기본 클래스 멤버 함수 포인터가 아닌가요? 파생 클래스 멤버 함수 포인터? – John

관련 문제