2010-12-08 3 views
0

Я пытаюсь использовать Qt's 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

Две вещи здесь. Во-первых, переменная listof объявлена ​​внутри цикла foreach, поэтому она может быть не видна в точке создания future. Во-вторых, вы должны использовать &ClassName::processImage как второй параметр для QtConcurrent::map().

UPDATE:

Глядя на документации, кажется, вам нужно написать вызов для создания карты таким образом:

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

(вы должны использовать boost.bind для преобразования функции-члена в нормальную функцию, то есть map ожидать в качестве второго аргумента).

1

Я думаю, что он принимает функцию вместо адреса функции.

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

+0

Да, чтобы получить указатель на нестационарную функцию-член, вы должны использовать `& Class :: func` с амперсандом. – aschepler 2010-12-08 21:15:40

+0

Спасибо, Марк! любые идеи для второй ошибки? – Sharethefun 2010-12-08 21:55:59

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, но функция член от ClassName. Вы можете добиться чего-то вроде этого с повышением :: Bind (и, вероятно, также с некоторыми mem_fun/bind1st-фу из STL):

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

Тем не менее, это не будет работать, как вы не можете назвать QTextEdit :: setText() из других потоков, кроме потока пользовательского интерфейса.

Кроме того, это должно быть processImage (const QString &) вместо processImage (QString &).

Смежные вопросы