Не могу запустить асинхронно функцию с аргументом объекта - PullRequest
0 голосов
/ 08 марта 2019

Как передать объект функции, которая запускается асинхронно?

#include <future>
#include <thread>

class SomeObject
{
    void Dummy();
}

class A
{
    public:
      void Test1();
      void Test2(SomeObject o);
      void Test3(SomeObject &o);
}      

A a;
auto a = std::async(std::launch::async, &A::Test1, a);  // OK

SomeObject o;
auto b = std::async(std::launch::async, &A::Test2, a, o);  // ERROR
auto c = std::async(std::launch::async, &A::Test3, a, std::ref(o));  // ERROR

Функция T1 запускается без ошибок.Test2 и Test3 нужен объектный аргумент, но я получаю и ошибку: ни один экземпляр перегруженной функции std :: async не соответствует списку аргументов.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Может быть полезно включить более полный код. Например, я сразу вижу несколько проблем:

  • После закрывающей скобки ваши объявления класса не следуют через точку с запятой
  • Вы переопределяете переменную 'a'

Следующий исправленный код компилируется без ошибок в VS 2017 (не требуется c ++ 17):

#include <future>
#include <thread>

class SomeObject
{
    void Dummy();
};

class A
{
public:
    void Test1();
    void Test2(SomeObject o);
    void Test3(SomeObject &o);
};

void func()
{
    A a;
    auto d = std::async(std::launch::async, &A::Test1, a);  // OK

    SomeObject o;
    auto b = std::async(std::launch::async, &A::Test2, a, o);  // OK
    auto c = std::async(std::launch::async, &A::Test3, a, std::ref(o));  // OK
}
0 голосов
/ 08 марта 2019

код ошибки во время показа, в конце объявления класса пропущена точка с запятой. и он без ошибок компилируется в g ++ версии 7.3

...