Аргумент типа «void (ClassName ::) (QString &)» не соответствует «void (ClassName :: *) (QString &)» - PullRequest
0 голосов
/ 09 декабря 2010

Я пытаюсь использовать Qt qtconcurrentmap для обработки некоторых изображений, и я получаю следующую ошибку

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

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 09 декабря 2010

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

UPDATE

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

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

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

1 голос
/ 09 декабря 2010

О второй ошибке: Вы не можете передать нестатическую функцию-член, подобную этой. map () не будет знать, на какой объект его вызывать (который должен иметь тип ClassName).

Из документации QtConcurrentMap:

QtConcurrent :: map (), QtConcurrent :: mapped () и QtConcurrent :: mappedReduced () принимают указатели на функции-члены. Тип класса функции-члена должен соответствовать типу, сохраненному в последовательности: "

Вы передаете список QString, но функция-член от ClassName. Вы можете добиться чего-то подобного с помощью boost :: bind (и, возможно, также с помощью некоторого mem_fun / bind1st-fu из STL):

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

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

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

1 голос
/ 09 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...