2016-08-10 21 views
1

私はQtプロジェクトで作業しており、QLabelメンバ関数とそのパラメータへのポインタをとり、いくつかのラベルに適用する関数を実装することにしました。関数メンバポインタを関数のパラメータとして渡します

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 

} 

私はそれを呼び出そうとしました:

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

それは言う:

エラー:無視 'applyToLabels'

候補テンプレートの呼び出しのための一致メンバ関数を:「QLabel」と「QWidget」を一致させることができませんでした

どのような解決策ですか?ありがとう

+0

「QWidget」がエラーになっているのはなぜですか?完全な例は表示されていませんか? – Arunmu

+0

ClockSimはQWidgetの派生クラスです。 –

+0

また、 'char const(&)[10]'型の引数を渡しています。あなたのメンバー関数が 'const char *'を期待している場合、これはうまくいかないでしょう(多分あいまいさがあります) – Arunmu

答えて

5

setStylesSheetQWidgetの継承されたメンバーであるため、&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

関連する問題