2010-12-08 3 views
0

Qt의 qtconcurrentmap을 사용하여 일부 이미지를 처리하려고하는데 다음 오류가 발생합니다.'void (ClassName ::) (QString &)'형식의 인수가 'void (ClassName :: *) (QString &)'와 일치하지 않습니다.

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

나는 또한 내 코드

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); 
} 

어떤 아이디어

/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 (...)' 

을이되어지고있어?

답변

7

두 가지. 먼저 변수 listofforeach 루프 내에 선언되므로 future을 만들 때 표시되지 않을 수 있습니다. 둘째, QtConcurrent::map()의 두 번째 매개 변수로 &ClassName::processImage을 사용해야합니다.

UPDATE : 문서를 보면

는, 당신이지도이 방법을 만들기 위해 전화를 쓸 필요가 보인다

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

(당신은 멤버 함수를 변환 boost.bind을 사용해야합니다 두 번째 인수로 기대하는 것은 map입니다).

+0

어떻게 내가 그것을 놓칠 수 있었느냐? 대단한 답변! 두 번째 오류에 대한 아이디어가 있습니까? 나는 아직도 그것을 얻고있다 – Sharethefun

+0

나는 그렇게 생각한다. 문서를 보면,'map' 메쏘드는 함수를 두번째 매개 변수로 기대합니다. 이것을 위해 멤버 함수를 사용하려면 boost :: bind' :'boost :: bind (& ClassName :: processImage, this)'가 필요합니다. –

+0

그레이트 디에고, 왜 당신이 6 표를 가지고 있는지 궁금하지 않습니다! 나는이 오류가 발생하고 나는 boost 라이브러리를 사용하지 않기 때문에 짐작한다. 오류 : 'boost'가 선언되지 않았다. 아니야? – Sharethefun

1

기능 주소 대신 기능을 사용한다고 생각합니다. 여기

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

+0

예, 정적이 아닌 멤버 함수에 대한 포인터를 얻으려면 앰퍼샌드와 함께 & Class :: func'을 사용해야합니다. – aschepler

+0

마크 감사합니다! 두 번째 오류에 대한 아이디어? – Sharethefun

1

두 번째 오류 정보 : 이와 같이 비 정적 멤버 함수는 전달할 수 없습니다. 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)); 

아직도이 작동하지 않습니다 :: setText()는 UI 스레드가 아닌 다른 스레드에서 가져옵니다.

또한 processImage (QString &) 대신 processImage (const QString &) 여야합니다.

관련 문제