类型为'void(ClassName ::)(QString&)'的参数与'void(ClassName :: *)(QString&)'不匹配

时间:2010-12-08 21:08:55

标签: c++ qt qt4

我试图使用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 个答案:

答案 0 :(得分:7)

这里有两件事。首先,变量listofforeach循环内声明,因此在创建future时可能看不到它。其次,您应该使用&ClassName::processImage作为QtConcurrent::map()的第二个参数。

<强>更新

查看文档,您似乎需要编写调用以这种方式创建地图:

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

(你必须使用boost.bind将成员函数转换为普通函数,这是map期望的第二个参数。)

答案 1 :(得分:1)

我认为它采用的是函数而不是函数地址。

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

答案 2 :(得分:1)

关于第二个错误:您无法传递这样的非静态成员函数。 map()不知道调用它的对象(必须是ClassName类型)。

来自QtConcurrentMap docs:

  

QtConcurrent :: map(),QtConcurrent :: mapped()和QtConcurrent :: mappedReduced()接受指向成员函数的指针。成员函数类类型必须与序列中存储的类型匹配:“

传递QString列表,但成员函数来自ClassName。 你可以使用boost :: bind来实现这样的东西(可能还有一些来自STL的mem_fun / bind1st-fu):

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

这仍然无效,因为你无法从UI线程以外的其他线程调用QTextEdit :: setText()。

此外,它应该是processImage(const QString&amp;)而不是processImage(QString&amp;)。