2010-12-08 47 views
0

Qtのqtconcurrentmapを使って画像を処理しようとしていますが、'void(ClassName ::)(QString&)'型の引数が 'void(ClassName :: *)(QString&)'と一致しません

argument of type 'void (ClassName::)(QString&)' does not match 'void (ClassName::*)(QString&) 

私も

/Library/Frameworks/QtCore.framework/Headers/qtconcurrentmapkernel.h:: 
In member function 'bool QtConcurrent::MapKernel<Iterator, MapFunctor>::runIteration(Iterator, int, void*) 
[with Iterator = QList<QString>::iterator, MapFunctor = void (ClassName::*)(QString&)]': 


/Library/Frameworks/QtCore.framework/Headers/qtconcurrentmapkernel.h:73: 
error: must use '.*' or '->*' to call pointer-to-member function in 
'((QtConcurrent::MapKernel<QList<QString>::iterator, void (ClassName::*)(QString&)>*)this)->QtConcurrent::MapKernel<QList<QString>::iterator, void (ClassName::*)(QString&)>::map (...)' 

を取得していますこれは、任意のアイデア私のコード

void ClassName::processImage(QString &f) 
{ 

    Image image; 
     image.read(qPrintable(f)); 
     try { 
      //Apply effects on an Image 
     } catch (Magick::Exception & error) { 
      // Displaying any possible errors on the text browser 
      ui->textBrowser_error->setText(error.what()); 

     } 
} 



void ClassName::processAll() { 

    foreach (QFileInfo f, list) 
    {  QString str(f.absoluteFilePath()); 
      QList<QString> listof; 
      listof.append(str); 
    } 


    QFuture<void> future = QtConcurrent::map(listof, processImage); 
} 

のですか?

答えて

7

2つのこと。最初に、変数listofforeachループ内で宣言されているため、futureを作成する時点では表示されないことがあります。次に、QtConcurrent::map()の2番目のパラメータとして&ClassName::processImageを使用する必要があります。

UPDATE

はドキュメントを見てみると、あなたがマップをこのように作成するための呼び出しを記述する必要があるようだ:

QFuture<void> future = QtConcurrent::map(listof, boost::bind(&ClassName::processImage, this)); 

(あなたはメンバ関数を変換するboost.bindを使用する必要があります2番目の引数として期待しているのはmapです)。

+0

どのように私はそれを逃したことができますか?素晴らしい答え! 2番目のエラーはありますか? 私はまだそれを得ている – Sharethefun

+0

そうだと思います。ドキュメントを見ると、 'map'メソッドは関数を第2のパラメータとして期待しています。このためにメンバー関数を使用するには、boost :: bind': 'boost :: bind(&ClassName :: processImage、this)'が必要です。 –

+0

それは素晴らしいディエゴ、なぜあなたは6票を持っているのだろうか? 私はこのエラーが発生し、私はそのブーストライブラリを使用していないので、私は推測する: エラー: 'ブースト'が宣言されていません。 それは? – Sharethefun

1

私は機能アドレスの代わりに機能を持っていると思います。ここ

QFuture<void> future = QtConcurrent::map(listof, &ClassName::processImage);

+0

はい、静的でないメンバ関数へのポインタを取得するには、アンパサンドで '&Class :: func'を使用する必要があります。 – aschepler

+0

マークありがとうございます! 2番目のエラーのための任意のアイデア? – Sharethefun

1

2番目のエラーについて:このような非静的メンバー関数を渡すことはできません。 map()はそれを呼び出すオブジェクト(ClassName型でなければならない)を知りません。 QtConcurrentMapドキュメントから

QtConcurrent::map(), QtConcurrent::mapped(), and QtConcurrent::mappedReduced() accept pointers to member functions. The member function class type must match the type stored in the sequence: "

あなたはQStringのリストを渡しますが、メンバ関数は、クラス名からです。 あなたはブーストでこのような何かを達成することができます::(STLから、おそらくまた、いくつかのmem_fun/bind1st-FUで)バインドを:あなたはQTextEditを呼び出すことはできませんよう

...map(listof, boost::bind(&ClassName::processImage, this, _1)); 

それでもこれは動作しません:: UIスレッド以外のスレッドからsetText()

また、processImage(QString &)ではなく、processImage(const QString &)である必要があります。

関連する問題