Неразрешенный тип перегруженной функции при использовании QtConcurrent для QImage :: fill - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь вызвать QImage :: fill () асинхронно с использованием модуля QtConcurrent . Пример инвертирования пикселей работает нормально, но аналогичный синтаксис для метода заливки не работает:

#include <QApplication>
#include <QImage>
#include <QFuture>
#include <QtConcurrent/QtConcurrentRun>

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  QImage image(1920, 1080, QImage::Format_ARGB32_Premultiplied);
  QFuture<void> future = QtConcurrent::run(&image, &QImage::fill, Qt::transparent); // ko
  //QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba); // ok
  future.waitForFinished();
  return app.exec();
}

Компиляция завершается со следующей ошибкой:

error: no matching function for call to ‘run(QImage*, <unresolved overloaded function type>, Qt::GlobalColor)’
   10 |   QFuture<void> future = QtConcurrent::run(&img, &QImage::fill, Qt::transparent); // ko
      |                                                                                ^
In file included from /usr/include/x86_64-linux-gnu/qt5/QtConcurrent/QtConcurrentRun:1,
                 from /home/romain/code/qt/main.cc:4:
/usr/include/x86_64-linux-gnu/qt5/QtConcurrent/qtconcurrentrun.h:72:12: note: candidate: ‘template<class T> QFuture<T> QtConcurrent::run(T (*)())’
   72 | QFuture<T> run(T (*functionPointer)())
      |            ^~~
/usr/include/x86_64-linux-gnu/qt5/QtConcurrent/qtconcurrentrun.h:72:12: note:   template argument deduction/substitution failed:
/home/romain/code/qt/main.cc:10:80: note:   mismatched types ‘T()’ and ‘QImage’
   10 |   QFuture<void> future = QtConcurrent::run(&img, &QImage::fill, Qt::transparent); // ko
      |                                                                                ^

Это так? Можно ли помочь компилятору, явно пометив некоторые типы шаблонов?

1 Ответ

2 голосов
/ 06 марта 2020

Проблема в том, что QImage::fill имеет несколько перегрузок. Вам необходимо устранить неоднозначность, используя static_cast ...

QFuture<void> future = QtConcurrent::run(&image, static_cast<void(QImage::*)(Qt::GlobalColor)>(&QImage::fill), Qt::transparent);

или (поскольку это Qt) QOverload ...

QFuture<void> future = QtConcurrent::run(&image, qOverload<Qt::GlobalColor>(&QImage::fill), Qt::transparent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...