std :: asyn c слишком много аргументов - PullRequest
1 голос
/ 19 марта 2020

Хорошо, поэтому я пытаюсь использовать std :: future в проекте, но std :: asyn c Я использую его, постоянно повторяя, что аргументов слишком много. Я попытался понять, правильно ли я понял шаблон, но ничего плохого не пришло ко мне ... Вот вызов:

QVector<MyMesh::Point> N1;
QVector<MyMesh::Point> N2;
future<QVector<MyMesh::Point>> FN1 = async(launch::async, rangeSearch, &mesh, vit->idx(), diagBoundBox*0.02);
future<QVector<MyMesh::Point>> FN2 = async(launch::async, rangeSearch, &mesh, vit->idx(), diagBoundBox*0.02*2);
N1 = FN1.get();
N2 = FN2.get();

также используется метод rangeSearch:

QVector<MyMesh::Point> rangeSearch(MyMesh *_mesh, int pid, float range);

См. что-то не так?

РЕДАКТИРОВАТЬ: Вот минимальный воспроизводимый пример, извините за первый.

#include <future>

class Class
{
public:

    void A();
    int F(int a, int b, int c);
};

int Class::F(int a, int b, int c){
    return a+b+c;
}

void Class::A(){
    int N1;
    int N2;
    std::future<int> FN1 = std::async(std::launch::async, F, 1, 2, 3);
    std::future<int> FN2 = std::async(std::launch::async, F, 1, 2, 3);
    N1 = FN1.get();
    N2 = FN2.get();
}

int main()
{
    Class O;
    O.A();
}

Также ошибка:

main.cpp: In member function ‘void Class::A()’:
main.cpp:18:69: error: invalid use of non-static member function ‘int Class::F(int, int, int)’
     std::future<int> FN1 = std::async(std::launch::async, F, 1, 2, 3);
                                                                     ^
main.cpp:11:5: note: declared here
 int Class::F(int a, int b, int c){
     ^~~~~
main.cpp:19:69: error: invalid use of non-static member function ‘int Class::F(int, int, int)’
     std::future<int> FN2 = std::async(std::launch::async, F, 1, 2, 3);
                                                                     ^
main.cpp:11:5: note: declared here
 int Class::F(int a, int b, int c){
     ^~~~~

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

Проблема здесь не в количестве аргументов, которые вы передали. Это связано с природой аргумента - в частности, с попыткой передать функцию-член непосредственно std::async.

. Самый простой способ справиться с этим - это почти наверняка вызов функции-члена через лямбда-выражение:

#include <future>

class Class
{
public:
    void A();
    int F(int a, int b, int c);
};

int Class::F(int a, int b, int c)
{
    return a + b + c;
}

void Class::A()
{
    int N1;
    int N2;
    std::future<int> FN1 = std::async(std::launch::async, [&](int a, int b, int c) {
        return F(a, b, c); }, 1, 2, 3);
    std::future<int> FN2 = std::async(std::launch::async, [&](int a, int b, int c) {
        return F(a, b, c);}, 1, 2, 3);

    N1 = FN1.get();
    N2 = FN2.get();
}

int main()
{
    Class O;
    O.A();
}
2 голосов
/ 19 марта 2020

В коде есть две проблемы. Во-первых, чтобы создать указатель на функцию-член, синтаксис будет &Class::F. Во-вторых, когда вы используете функцию указателя на член, вам нужен объект для его применения. Таким образом, правильный вызов (внутри функции-члена Class::A)

std::future<int> FN1 =
    std::async(std::launch::async, &Class::F, this, 1, 2, 3);

std::async предполагает, что за указателем на функцию-член в списке аргументов будет следовать указатель или ссылка на объект, к которому должна применяться функция-член.

...