вызов функции-члена не работает в функции Qt "run". Как правильно использовать мой шаблон в «run»? - PullRequest
0 голосов
/ 18 марта 2020

Это мой шаблон

template <class T>
void writeData(QVector<T> &vec, const QString &fp, void(T::*method_ptr)(QFile&) )
{
    QFile f(fp);
    if(!f.open(QIODevice::WriteOnly | QIODevice::Append) )
    {
        qDebug() << "File error" << f.error();
    }
    else
    {
        QThread::currentThread();
        for(T &tw : vec)
        {
            (tw.*method_ptr)(f);
        }
    }
    f.close();
}

И здесь я бы использовал свой шаблон:

//teams is like: QVector<teamType> teams
QFuture<void> fut = run(writeData, teams, filePath, &teamType::writeTeams); // no matching function for call 'run'
                    ~~~                              ~~~~~~~~~~~~~~~~~~~
//So, what´s wrong here?

Потому что это прекрасно работает:

writeData(teams, filePath, &teamType::writeTeams);

И "& teamType :: writeTeams "происходит от следующего:

void teamType::writeTeams(QFile &f)
{
    QTextStream out(&f);
    out.setCodec("UTF-16LE");
    out << teamId << "\t" << offsideTrap << "\t" << withoutBall << "\t" << formationId << "\t"
            << attack << "\t" << teamMentality << "\t" << attackTactic1 << "\t"
            << attackTactic2 << "\t" << defenseTactic1 << "\t" << defenseTactic2 << "\t" << captain << "\t"
            << penaltyTakerId << "\t" << kickTakerId << "\t" << leftCornerkickTakerId << "\t" << rightCornerkickTakerId << "\t"
            << numTransfersIn << endl;
}

Это функция-член в классе" teamType "

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Я получил решение, теперь все отлично работает:

template <class T>
void writeTeamsForLoop(QVector<T> &vec, const QString fp, void(T::*method_ptr)(QFile&) ) 
{                                       //QString must not be a reference(const QString fp)!
    QFile f(fp);
    if(!f.open(QIODevice::WriteOnly | QIODevice::Append) )
    {
        qDebug() << "File error" << f.error();
    }
    else
    {
        QThread::currentThread();
        for(T &tw : vec)
        {
            (tw.*method_ptr)(f);
        }
    }
    f.close();
}

Лямбда-код:

QFuture<void> fut = run([&, filePath]{ writeData(teams, filePath, &teamType::writeTeams); } );
0 голосов
/ 18 марта 2020

, поскольку writeData является шаблоном функции, нет механизма, который run может использовать для получения правильной реализации этого шаблона для параметров.

Самое простое решение - просто обернуть вызов в лямбду. Это выглядело бы как

QFuture<void> fut = run([=](){ writeData(teams, filePath, &teamType::writeTeams); });

, и теперь, когда вызов writeData фактически выполнен с параметрами функции, вывод аргумента шаблона будет успешным и код скомпилируется.

...